ここに挙げたのは、「シフトJISコード」という、主にWindowsやMacintoshで用いられる漢字コードのうち、perlで使用する際に注意しなければならない文字です。
コードを見ていただければわかるとおり、これらの文字の下位バイトには、C言語やperlなどでエスケープシーケンスとして用いられる「\」(ASCIIコード5c)と同じコードが用いられています。そのため、シフトJISコードで書かれたperlスクリプトをUNIXサーバで実行させた時、「表示」(95 5c 8e a6)という文字列が「侮ヲ」(95 8e a6:「ヲ」は半角文字の「ヲ」)というふうに文字化けしたりします。
- perlは日本語を解釈できないため、「表」の下位バイトをバックスラッシュ(\)と解釈する。
- 次の「示」の上位バイトと組み合わせてエスケープシーケンス「5c 8e」と解釈する。
- しかし、「5c 8e」というエスケープシーケンスは存在しないため、バックスラッシュを無視して「8e」と解釈する。
- 「95 8e a6」というコードがブラウザに送られる。
- ブラウザは日本語を解釈できるため、「95 8e」というコードから「侮」を、「a6」というコードから半角カナの「ヲ」を表示する。
この現象はあくまでも「シフトJISコードで書かれたperlスクリプトをUNIXサーバで実行させた時」に発生する現象です。perlスクリプトがEUCコードで書かれていれば、何の問題もありません。また、JPerlのような日本語を扱えるperlを用いても、同様のはずです(手元にJPerlの環境がないため、未確認)。
(2000.12.11 追記)UNIX-CやOracleのデータベースでも発生する可能性があります。
これは、perlスクリプトをEUCコードで記述するか、「表\示」のように、0x5cのコードの次にもう一つバックスラッシュ(\)を挿入することで解決できます(perlでは「\\」はバックスラッシュ自身を表すため)。
(2000.12.11 追記)C言語や他のスクリプトも同様です。ただし、perlやcshのようなスクリプトの場合、シングルコーテーション(')でくくると「\」をエスケープシーケンスと認識しないため、問題が解決することがあります。
- ―(81 5C) : Horizontal Bar
- ソ(83 5C) : Katakana Letter So
- Ы(84 5C) : Cyrillic Capital Letter Yeru
- 噂(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) : ハン、バン