• ベストアンサー

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です、よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.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文字列に変換してやらないといけません。

bouzu01
質問者

お礼

BLUEPIXYさん、ご回答ありがとうございました。 お礼が遅れて申し訳ありません。 今回はいそいで仕上げる必要があったので utf-8は諦めて、eucですべて書き直しておりました。 教えて頂いたコードであらためて、utf-8にチャレンジしたいと思います。

その他の回答 (1)

  • osamuy
  • ベストアンサー率42% (1231/2878)
回答No.1

utf8フラグがたっている文字列をエンコードしようとしているなら、 事前に、Encode::encode( 'utf8', $data );等で、utf8フラグを外した(nallow char)文字列にしてから、URL encodingすれば良いのでは。 単にURL encodingのやり方が知りたいだけなら、perlfaq9。

参考URL:
http://perldoc.jp/docs/perl/5.6.1/perlfaq9.pod
bouzu01
質問者

補足

osamuyさん、ご回答ありがとうございます。 フラグを外すのですか、わざわざ utf8::decode ( $msg ); としてつけていました。 参考URLで、エンコードするにはCGI.pm をつかうとあったので エンコードの仕方を調べてやっていますが どうも上手くいきません。 自力でもがんばってみますが。どなたかCGI.pmをつかった エンコード方法の分かる方いますでしょうか?

関連するQ&A

専門家に質問してみよう