ここに挙げたのは、「シフトJISコード」という、主にWindowsやMacintoshで用いられる漢字コードのうち、perlで使用する際に注意しなければならない文字です。

コードを見ていただければわかるとおり、これらの文字の下位バイトには、C言語やperlなどでエスケープシーケンスとして用いられる「」(ASCIIコード5c)と同じコードが用いられています。そのため、シフトJISコードで書かれたperlスクリプトをUNIXサーバで実行させた時、「表示」(95 5c 8e a6)という文字列が「侮ヲ」(95 8e a6:「ヲ」は半角文字の「ヲ」)というふうに文字化けしたりします。

  1. perlは日本語を解釈できないため、「表」の下位バイトをバックスラッシュ()と解釈する。
  2. 次の「示」の上位バイトと組み合わせてエスケープシーケンス「5c 8e」と解釈する。
  3. しかし、「5c 8e」というエスケープシーケンスは存在しないため、バックスラッシュを無視して「8e」と解釈する。
  4. 「95 8e a6」というコードがブラウザに送られる。
  5. ブラウザは日本語を解釈できるため、「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のようなスクリプトの場合、シングルコーテーション(')でくくると「」をエスケープシーケンスと認識しないため、問題が解決することがあります。