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 |
|
|
|