- ベストアンサー
utf-8コードの指定
フォームから受け取ったデータをシフトJISに指定して受け取る場合は、例えば $value=jcode::sjis($value); とすれば良いわけですが、utf-8で受け取る場合はどうすればいいのでしょう? とりあえずjcode.plの中にはutf-8に関するコードは無さげです・・・
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
質問者さんのやりたいこと(バイトコードから別の文字コードのバイトコードへ変換する)だけを行うのであれば、 下記サイトを参考にされるとよいです。 http://www.horse-water.mydns.jp/tips/tips_P00023.html Jcode.pmを使うのであれば... use Jcode; my $after_str = Jcode->new($before_str, 'euc')->utf8; のように、 Jcode->new(変換する文字列,変換前の文字コード)->utf8; でよいようですね。 Encode.pmを使うのであれば... use Encode; Encode::from_to($str, 'eucJP', 'utf8'); のように、 Encode::from_to(変換する文字列,変換前の文字コード,'utf8'); でよいようですね。 ほそく。 http://blog.livedoor.jp/dankogai/archives/51031595.html ↑このページで説明している内容は、utf8フラグのお話です。 ただ単にutf8に変換する(いわゆるバイトコードからバイトコードへ)とは別の話です。 バイトコード同士で変換する場合は、変換後すぐ出力しても問題ありませんが、utf8フラグ付きで変換するとエンコードしてフラグをとらずに標準 出力にマルチバイト文字列を出そうものなら、Wide Charaほげほげ。と叱られます。 ブラウザに出力しようものならば、文字化けしちゃいます。 そんなわけで、正しいutf8フラグの使い方はこうですよ~ って説明されているのが上記ページです。
その他の回答 (2)
- kirikirkaz
- ベストアンサー率60% (21/35)
#1のリンク先にも書いてある通り、perlのバージョンが5.8以上の場合、Jcodeは内部的にEncodeを使います。 Encodeはjcode.pl、Jcodeよりも高機能なので、今はEncodeを使うのが主流になっています。 (jcode.plやJcodeをあまり使ったことがないので比べて何が高機能なのかよく知りませんがとにかく色々できるそうです) 以下Encodeを解説してるページです (というかEncodeモジュールを作った人が書いてるんですが) 初心者向け http://blog.livedoor.jp/dankogai/archives/51031595.html こちらはまだ必要ないと思いますが参考までに http://blog.livedoor.jp/dankogai/archives/51047005.html
- MOMON12345
- ベストアンサー率32% (1125/3490)
jcode.plってUTFに対応していなかった気がします。 Jcode.pmを使うのが宜しいかと。 http://openlab.ring.gr.jp/Jcode/index-j.html
お礼
アドバイスをありがとうございます。 私が今持っている掲示板CGIはシフトJISを用いています。で、新たな書き込みがあった際にはこのサブルーチンで受け取ります。 #================== フォームデータ取り込み ==== sub loadFormdata() { foreach $key ($cgi->param()) { $value = $cgi->param($key); $value =~ tr/+/ /; $value =~ s/%([0-9a-fA-F][0-9a-fA-F])/chr(hex($1))/eg; $value = jcode:sjis($value); $value =~ s/&/&/g; $value =~ s/</</g; $value =~ s/>/>/g; $value =~ s/\x0D\x0A/<br>/g; $value =~ tr/\t/ /; $FORM{$key} = $value; } } このCGIの元となった教本によると、jcodeが使われている部分は、「フォームから送られるフォームデータの文字コードは、通常はそのフォームのあるHTMLテキストの文字コードと同じです。しかし、これは保証されているわけではないため、他の文字コードでフォームデータが送られてくる可能性もあります。そのため、ここで強制的にシフトJISに変換してしまっています。」とのこと。 つまり送られてくるフォームデータがどの文字コードか分からないわけです。となると、ここでは $str2 = Jcode->new( $str1, "utf8")->sjis; のようなコードは使えません。 探してみると「http://www.mytools.net/memo/JcodePM.html」に、 $str = Jcode($str)->[sjis|euc|jis|utf8]; というコードがありました。 そこで件のコードを $value = Jcode($value)->[utf8]; と書き換えてみました。 これでOKです。 ありがとうございました。