アプリ版:「スタンプのみでお礼する」機能のリリースについて

フォームから受け取った文字コードの処理において、普段下記の通りにしております。

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」が含まれた文字列の変換を行う場合は、何か特別な処理が必要でしょうか?

A 回答 (1件)

&ReadParse;


これは、cgi-lib.pl の関数ですよね?
$in{$key} .= "\0" if (defined($in{$key})); # \0 is the multiple separator

キーが同じものが存在する時、データが消失しないように繋いでいますが、区切り文字は、送信文字に使われる可能性のあるものでは、あとで区切り位置が狂ったりするので、どの文字コードにも使われない\0を使っているのでしょう。
チェックボックスデータであることが確実なら、データに入っていないであろうタブコードか改行コードに置き換えてから、文字コード変換するのがよいかと思います。

以下の一行をwhile文の次に追加
$v =~ tr/\0/\t/;
    • good
    • 0
この回答へのお礼

>チェックボックスデータであることが確実なら、データに入っていないであろうタブコードか改行コードに置き換えてから、文字コード変換するのがよいかと思います。

ご回答ありがとうございました。

無事、「$v =~ tr/\0/\t/;」で区切りの\0をタブに待避させ、また元に戻してやることで、文字コードの変換がうまく行きました。

本当にありがとうございました。

「\0」の区切りはcgi-lib.pl固有のものだったんですね、、、お恥ずかしいです。

お礼日時:2006/05/20 14:25

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!