Home >Shift-JISの文字化けについて

- 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」のコードが使われている文字は、次のようなものがあります。
    Ы
  • 最後に注意点として、これらの文字を「クォーテーションの末尾」に使う場合には、文字化けとはならずに「文法エラー」となるので、特に注意が必要です。 この場合の対処方法は、シングルクォートでも、直後にエスケープ記号「¥」を付加します。
    # 悪い例
    print "計画表"; # 文法エラー
    print '計画表'; # 文法エラー
    
    # 良い例
    print "計画表\";
    print '計画表\';