CGIの解説書などで、データのセパレータとして「^(0x5E)」という文字を使っているのを見た方は多いと思いますが、これをセパレータに使う以上、データの中に含まれる"^"をデコードの際に取り除かなければなりません。しかし、S-JISではこの"^"を2バイト目に含む文字があるため、不具合が生じます。
また、パターンマッチで変数を使用する場合、その変数に「^(0x5E)」が含まれていると、メタ文字と解釈されるために、たいていパターンマッチに失敗します。Perlではパターンに変数が使われていると実行時にコンパイルしますので、「^(0x5E)」を含む文字をマッチングしようとしたときだけ Server Errorとなるはずです。
回避方法
-
セパレータを他の文字に変更する
これしか方法はありません。私は現在もっぱら「\t(水平タブ:0x09)」をセパレータに使っています。水平タブコードはS-JISに含まれませんし、その上フォームでは入力フィールドの移動に使われるので、フォームからの入力にタブが含まれることがないからです。
-
パターンマッチの前にEUCにコード変換する
通常のPerlで日本語のパターンマッチをする場合は、文字列をあらかじめEUCコードに変換しておくのがいいでしょう。コード変換はjcode.plなどを使います。
以下に、「^」を含む文字の一覧を挙げておきます。全部で39文字あります。
| 文字 |
コード |
| / |
81 5E |
| タ |
83 5E |
| Э |
84 5E |
| 運 |
89 5E |
| 蛙 |
8A 5E |
| 疑 |
8B 5E |
| 型 |
8C 5E |
| 洪 |
8D 5E |
| 賛 |
8E 5E |
| 戎 |
8F 5E |
|
| 文字 |
コード |
| 真 |
90 5E |
| 楚 |
91 5E |
| 耽 |
92 5E |
| 顛 |
93 5E |
| 膿 |
94 5E |
| 豹 |
95 5E |
| 某 |
96 5E |
| 与 |
97 5E |
| 録 |
98 5E |
| 竸 |
99 5E |
|
| 文字 |
コード |
| 喊 |
9A 5E |
| 嫂 |
9B 5E |
| 弯 |
9C 5E |
| 擔 |
9D 5E |
| 杰 |
9E 5E |
| 歐 |
9F 5E |
| 濘 |
E0 5E |
| 畤 |
E1 5E |
| 秧 |
E2 5E |
| 綽 |
E3 5E |
|
| 文字 |
コード |
| 膺 |
E4 5E |
| 蘓 |
E5 5E |
| 訖 |
E6 5E |
| 躾 |
E7 5E |
| 鐃 |
E8 5E |
| 饋 |
E9 5E |
| 鷽 |
EA 5E |
| ^ |
ED 5E |
| ^ |
EE 5E |
|
|
|