Home > Shift-JISの文字化けについて
|
Shift-JISの文字化け
- シフトJISコードで「表示」という文字を、CGIスクリプト中に記述して出力すると「侮ヲ」と文字化けします。 「侮」というイメージから、何だかコンピュータに馬鹿にされている気持ちになったりもします。
- どうしてこのように文字化けしてしまうのでしょうか? このコーナではそんな文字化けについて考察してみます。
文字化けの原因
- 日本語は1文字当り2バイトで表現され、シフトJISの「表示」という文字コードは以下のとおりになります。
文字 表 示 Shift-JISコード 95 5c 8E A6 - ここで都合の悪いことが発生します。実は、「表」の2バイト目の「5C」に問題があるのです。
「5C」とはメタ文字(特殊文字)の「¥」の文字コードと重複するのです(Shift-JISの場合)。
「¥」が文字列中にあると、コンピュータはこれをエスケープ記号として解釈し、次のように取り去って表示してしまうのです。
(1) 95 5C 8E A6 ... 記述時点 (2) 95 8E A6 ... 「5C」を「¥」と解釈し取り去る(その次の8Eをエスケープすると解釈) (3) 95 8E A6 ... 展開結果
- このようにして、展開結果は以下のようなコードで出力されることになります。
文字 侮 ヲ (半角) Shift-JISコード 95 8E A6
対策
- このような文字化けを回避するためには、以下のような回避策があります。
案1 : メタ文字を含むShift-JIS文字には、後にエスケープ記号「¥」を付ける。
# 例 print "表\示";
【解説】 「表 + ¥」という文字コードで 95 5C 5C となり、中央の 5C が次の 5C をエスケープ展開して、結果として 95 5C として出力される。案2 : ダブルクォート「"」で囲まずに、シングルクォート「'」を使用する。# 例 print '表示';
【解説】 シングルクォート「'」内では文法上「展開」処理をしないため、文字コードの 95 5C はそのまま解釈されて出力される。 - 「表」という文字のように、2バイト目に「5C」のコードが使われている文字は、次のようなものがあります。
― ソ Ы \ 噂 浬 欺 圭 構 蚕 十 申 曾 箪 貼 能 表 暴 予 禄 兔 喀 媾 彌 拿 杤 歃 濬 畚 秉 綵 臀 藹 觸 軆 鐔 饅 鷭 x x - 最後に注意点として、これらの文字を「クォーテーションの末尾」に使う場合には、文字化けとはならずに「文法エラー」となるので、特に注意が必要です。
この場合の対処方法は、シングルクォートでも、直後にエスケープ記号「¥」を付加します。
# 悪い例 print "計画表"; # 文法エラー print '計画表'; # 文法エラー # 良い例 print "計画表\"; print '計画表\';