- ベストアンサー
Jcode を使った複数選択値の文字コード変換について
フォームから受け取った文字コードの処理において、普段下記の通りにしております。 use Jcode; &ReadParse; while(($k,$v)=each %in){ &Jcode::convert(\$v,"euc");} 基本的に元htmlがsjisだろうがutf-8だろうが問題なくeucに変換されているのですが、 複数選択(フォーム側がチェックボックスなどで、NAME値が複数ある場合)された変数だけは、eucに変換されず文字化けしてしまい、肝心の区切り文字である「\0」も消えてしまう状態です。 &Jcode::convert(\$v,"euc");の部分を、$v にしたり *v にしたり色々してみたのですが、複数選択が正しく処理されているときは単一項目がうまくいかなかったりという状態です。 getcodeで調べてみると、複数選択のフォームのコードは ucs2 となっていました。(元のhtmlはeuc。) 試しにvalue値を全て半角英数にしてみたのですが、同じく ucs2 と出ます。(単項目は euc と出ます。) 「\0」が含まれた文字列の変換を行う場合は、何か特別な処理が必要でしょうか?
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
&ReadParse; これは、cgi-lib.pl の関数ですよね? $in{$key} .= "\0" if (defined($in{$key})); # \0 is the multiple separator キーが同じものが存在する時、データが消失しないように繋いでいますが、区切り文字は、送信文字に使われる可能性のあるものでは、あとで区切り位置が狂ったりするので、どの文字コードにも使われない\0を使っているのでしょう。 チェックボックスデータであることが確実なら、データに入っていないであろうタブコードか改行コードに置き換えてから、文字コード変換するのがよいかと思います。 以下の一行をwhile文の次に追加 $v =~ tr/\0/\t/;
お礼
>チェックボックスデータであることが確実なら、データに入っていないであろうタブコードか改行コードに置き換えてから、文字コード変換するのがよいかと思います。 ご回答ありがとうございました。 無事、「$v =~ tr/\0/\t/;」で区切りの\0をタブに待避させ、また元に戻してやることで、文字コードの変換がうまく行きました。 本当にありがとうございました。 「\0」の区切りはcgi-lib.pl固有のものだったんですね、、、お恥ずかしいです。