2016年8月25日星期四

Mstn MDL 「表示」と言う文字を文字化けしました

文字化けについて

  • シフトJISコードで「表示」という文字を、CGIスクリプト中に記述して出力すると「侮ヲ」と文字化けします。
  • 「侮」という文字から、何だかコンピュータに馬鹿にされている気持ちになったりもします。
  • どうしてこのように文字化けしてしまうのでしょうか? このコーナではそんな文字化けについて考察してみます。
  • まず日本語文字コードの基礎知識として、大きく以下のようなコードが存在することを理解しておきましょう。
    文字コード摘要
    JISコードJIS規格のX0208で定められた文字集合。7ビットコード2文字で日本語文字を表現します。メールで使用する代表的な文字コード。
    EUCコード日本語UNIX環境で使用される文字コード。8ビットコードで表現されます。
    シフトJISコードMicrosoft社が決めたコードで、主にパソコンを基盤に、WindowsやMacで使用されます。8ビット領域も使用します。
    Unicodeすべての文字を2バイトで表し、世界中の文字を表現しようとしています。

  • KENT WEBではCGIスクリプトは「シフトJISコード」で記述しています。
  • 本当は文字化けや正規表現処理などを考慮するとEUCコードで書く方が都合がよく、もし自分のためだけに使用するCGIスクリプトであるならば、迷わずEUCコードで記述することでしょう。
  • ここでさきほど述べたシフトJISの「表示」という文字コードは以下のとおりです。
    文字表示
    シフトJISコード955C8EA6

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

  • このようにして、展開結果は以下のようなコードで出力されることになります。
    文字侮ヲ (半角)
    シフトJISコード958EA6

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

      例 : print "表\示";

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

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

      例 : print '表示';

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

  • 「表」のように2バイト目に「5C」のコードが使われている文字は以下のとおりです。
    *これらの文字を使用する際は「表」に対する対処法とまったく同じです。
    ―ソЫⅨ噂浬欺圭構蚕十申曾箪貼能表暴予禄
    兔喀媾彌拿杤歃濬畚秉綵臀藹觸軆鐔饅鷭偆砡

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

    良い例1 : $title = "計画表\";
    良い例2 : $title = '計画表\';
    ★以上の文章以下のurlから:
     http://www.kent-web.com/pubc/jcode/

没有评论:

发表评论