- ベストアンサー
utf-8の文字列に対してURLエンコードを行なうには?
最近 perlをutf-8で書き始めたのですが、文字コードではまっています。 cgiの内部から別のcgiへpostで全角文字を送る場合 URLエンコードしてから送ると思うのですが 文字コードがutf-8の時、どのようにURLエンコードしたら 良いのか分からず困っています。どなたかご存知でしょうか? ちなみに文字を受ける方のcgiでは以下の様にURLデコードしています。 $data =~ tr/+/ /; $data =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack('H2', $1)/eg; 試用しているperlのバージョンはperl5.8です、よろしくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
#こんな感じでどうでしょうか use encoding 'UTF-8'; use Encode qw(encode); $data="日本語文字列"; $octets=encode('UTF16BE',$data); $len=length $octets; for($i=0;$i<$len/2;$i++){ $code=vec($octets,$i,16); printf "%%u%04X",$code; } #ユニコード文字列は、%uでURLエンコードできます #UTF8は、バイト数が状況で変わるので、一旦UNICODE16に変換してます #注意すべきは、$dataは、UTF8(内部コード)で、UTF8のオクテット列ではないということです。他からデータとしてUTF8のオクテット列を受け取るなら、それから一旦decode_utt8してPerl文字列に変換してやらないといけません。
その他の回答 (1)
- osamuy
- ベストアンサー率42% (1231/2878)
utf8フラグがたっている文字列をエンコードしようとしているなら、 事前に、Encode::encode( 'utf8', $data );等で、utf8フラグを外した(nallow char)文字列にしてから、URL encodingすれば良いのでは。 単にURL encodingのやり方が知りたいだけなら、perlfaq9。
補足
osamuyさん、ご回答ありがとうございます。 フラグを外すのですか、わざわざ utf8::decode ( $msg ); としてつけていました。 参考URLで、エンコードするにはCGI.pm をつかうとあったので エンコードの仕方を調べてやっていますが どうも上手くいきません。 自力でもがんばってみますが。どなたかCGI.pmをつかった エンコード方法の分かる方いますでしょうか?
お礼
BLUEPIXYさん、ご回答ありがとうございました。 お礼が遅れて申し訳ありません。 今回はいそいで仕上げる必要があったので utf-8は諦めて、eucですべて書き直しておりました。 教えて頂いたコードであらためて、utf-8にチャレンジしたいと思います。