Top / CGI相談室 / トラブル / 文字化け

space

文字化け

Top / CGI相談室 / トラブル / 文字化け

Last-modified: 2006-11-20 (月) 10:26:49

基本知識

日本語の文字コードにはマシンによって大きく3種類のものが存在します。
また 多くのサイトで配布されているスクリプトの多くは、Windows形式(シフトJIS)で表示されるように記述されています。
従って、各パソコン上でスクリプトを編集する場合は別として、サーバへCGIファイルをFTP転送した場合「文字コードはシフトJIS」となるようにする必要があります。
つまり、文字コードの相違が生じた場合に「文字化け」が発生してしまいます。

OS文字コード
WindowsシフトJIS
MacシフトJIS
UNIXEUC

シフトJIS特有の文字化け

WindowsやMacitoshで「文字化け」する場合、以下のような特定の文字を使用する場合に発生します。

Ы

この場合、¥*1というエスケープ文字を後につけて文字化けを防ぐことができます。

【例】
print "表示する"; ... 文字化けする
print "表\示する"; ... 文字化けしない

シフトJISコードで「表示」という文字を、CGIスクリプト中に記述して出力すると「侮ヲ」と文字化けします。
どうしてこのように文字化けしてしまうのでしょうか?

まず日本語文字コードの基礎知識として、大きく以下のようなコードが存在することを理解しておきましょう。

文字コード摘要
JISコードJIS規格のX0208で定められた文字集合。7ビットコード2文字で日本語文字を表現します。メールで使用する代表的な文字コード。
EUCコード日本語UNIX環境で使用される文字コード。8ビットコードで表現されます。
シフトJISコードMicrosoft社が決めたコードで、主にパソコンを基盤に、WindowsやMacで使用されます。8ビット領域も使用します。
Unicodeすべての文字を2バイトで表し、世界中の文字を表現しようとしています。

ここでさきほど述べたシフトJISの「表示」という文字コードは以下のとおりです。

文字
シフトJISコード955C8EA6

ここで都合の悪いことが発生します。実は、「表」の2バイト目の「5C」に問題があるのです。
つまり、「5C」とはメタ文字(特殊文字)の「¥」を表すからです。
「¥」が文字列中にあると、それはエスケープ記号として単に取り去られてしまいます。
したがって、「表示」という文字をCGIが出力するときには以下のように展開してしまいます。

  1. 95 5C 8E A6 .... 記述時点
  2. 95 8E A6 .... 「5C」を「¥」と解釈し取り去る(その次の8Eをエスケープすると解釈)
  3. 95 8E A6 .... 展開結果

このようにして、展開結果は以下のようなコードで出力されることになります。

文字ヲ(半角)
シフトJISコード958EA6 

このような文字化けを防止するには以下のような方法があります。
「表」のようなメタ文字を含む文字には、後にエスケープ記号「¥」を付ける。

例 : print "表\示";

理由 : 「表 + ¥」という文字コードで 95 5C 5C となり、中央の 5C が次の 5C をエスケープ展開し、結果として 95 5C として出力される。

ダブルクオーテーションマーク「"」で囲まずに、シングルクオーテーションマーク「'」を使用する。

例 : print '表示';

理由 : シングルクオーテーション「'」内では文法上「展開」処理をしないため、文字コードの 95 5C はそのまま解釈されて出力される。

「表」のように2バイト目に「5C」のコードが使われている文字は上に掲載した物です。
これらの文字を使用する際は「表」に対する対処法とまったく同じでかまいません。

【注意】ただし、この文字化け文字(2バイト目に 5C が来る文字)をエスケープしない状態で
「ダブルクオーテーション」又は「シングルクオーテーション」の中で末尾に使う場合には、
文字化けとはならずに Perlが「文法エラー」となってしまうので、特に注意が必要です。
この場合の対処方法は前掲と同じで直後にエスケープ記号「¥」を付加します。

悪い例1 : $title = "計画表"; → サーバエラー(文法エラーとなる) 
悪い例2 : $title = '計画表'; → サーバエラー(文法エラーとなる)
良い例1 : $title = "計画表\"; 
良い例2 : $title = '計画表\'; 

半角カナの使用は厳禁

掲示板の投稿記事や、チャットの発言では、jcode.plを使った文字コード変換処理 を行いますが、このとき「半角カナ」を使用した投稿があると、文字化けしてしまうことがあります。
これはたとえば、シフトJISの半角カナが使用するコード領域が、EUCが使うコード領域と重なるため、jcode.plが文字コードの変換に失敗してしてしまうためです。
従って、掲示板やチャットの使用時には「半角カナ」は厳禁であり、訪問者(投稿者)に 対してもそのようにお願いをする必要があります。

FTPソフトが自動変換していないか?

FTPソフトの設定で、転送するCGIスクリプトの文字コードを自動変換する機能が付いているものがありますが、ユーザの知らないうちにEUCコードに自動変換してしまうケースがあります。
表示画面全体が文字化けしてしまうケースでは、この原因を疑ってみましょう。

参考

このページは、KENT WEBを参考にさせていただきました。


*1 実際は半角の¥ですが、表示が\(バックスラッシュ)になってしまう為、この項目内では全角で表示しています。

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2006-11-20 (月) 10:26:49 (4655d)
[ Counter today ]