Perl Script Laboratory

文字化けする文字一覧表

スクリプト中で文字列をHTMLに出力するときに文字化けしてしまった経験がある方は多いと思いますが、これは、Shift-JIS(MS-Kanji) コードでスクリプトを記述することで、漢字コードの中にメタ文字である「\(0x5C)」が含まれてしまうことが原因です。

回避方法

  • スクリプト全体をEUCなどで保存する。
    これは一見便利ですが、UNIX以外のPCまたはMacからフォーム入力を受け付ける場合などたいていS-JISであり、普段のコード管理がめんどうです。
  • シングルクォートで文字列を囲む。
    可能な限り、「 print <<'HTML'; … HTML 」または「 print '…'; 」など、メタ文字が展開されないようにすることで回避できます。ただし、文字列中に変数を展開させたい場合はこれもまた面倒です。
  • 文字化けを起こす文字の後に「\」を付加する。
    「\」が文字列中にあると、その次の1バイトが特別なものでない限り、「\」は単に取り去られてしまいます。そこで、「\」が消されないようにするために、「\」を文字化けする文字の末尾に付け足します(「 print "十\個の表\示\n"; 」など)。これによって文字化けが回避されます(「\\」は展開されて「\」になる)。

以下に、「\」を含む文字の一覧を挙げておきます。こうしてみると、ほとんど使わない文字も含めて、たったの40文字なのです。これらの文字をS-JISで使う場合には注意しましょう。

文字 コード
81 5C
83 5C
Ы 84 5C
\ 87 5C
89 5C
8A 5C
8B 5C
8C 5C
8D 5C
8E 5C
文字 コード
8F 5C
90 5C
91 5C
92 5C
93 5C
94 5C
95 5C
96 5C
97 5C
98 5C
文字 コード
99 5C
9A 5C
9B 5C
9C 5C
9D 5C
9E 5C
9F 5C
E0 5C
E1 5C
E2 5C
文字 コード
E3 5C
E4 5C
E5 5C
E6 5C
E7 5C
E8 5C
E9 5C
EA 5C
\ ED 5C
\ EE 5C

なお、上記の例はメタ文字といっても「\」だけでしたが、2バイト文字を正規表現の中で使う場合はさらに「[」や「{」、「(」などが入っていてもうまく行きません。これについては近日中にまとめておきます。