• ベストアンサー

標準入力からのutf-8→euc-jpで一部文字化け

これまでeuc-jpで作られていたHTMLフォームページをutf-8に変更したところ、フォームメールCGIの文字列処理で「~」「-」「 」(半角スペース)など一部の文字が文字化けするようになってしまいました。 Jcode.pm → Encodeに変更してみても症状は変わりませんでした。 Encodeは初めて使うのですが、過去ログを見てもよく分かりません・・・ どうぞお力添えをお願いします。 (1)下記のperlの記述方法で間違っている箇所はありますか? (2)正しく出力できる方法がありましたら、教えてください。 (3)http://oshiete1.goo.ne.jp/kotaeru.php3?q=1540626 で話されている、右側の折れ曲がった「~」はどうやって入力するのでしょうか? (3)perl側もutf-8で記述すれば、文字化けなど発生せずに処理出来るものなのでしょうか? ↓perl5.8 文字コードeuc-jp #!/usr/bin/perl use Encode;#### if ($ENV{'CONTENT_TYPE'} =~ /application\/x-www-form-urlencoded/i) { binmode(STDIN); read(STDIN,$buffer,$ENV{'CONTENT_LENGTH'}); @data_s = split(/&/,$buffer); foreach $buffer (@data_s) { ($key,$value) = split(/=/,$buffer); $value =~ tr/+/ /; $value =~ s/%([0-9A-Fa-f][0-9A-Fa-f])/pack("C",hex($1))/eg; $value = encode("euc-jp", $value);#### print "$key = $value\n"; } }

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

  • ベストアンサー
回答No.2

まず、Encodeモジュールのencodeメソッドとdecodeメソッドは単純に文字コードの変換を行うものではありません。 詳細は参考URLを見てください。簡単に言うと、特定の文字コードの文字列とPerl内部のUTF-8コードとの相互変換をするためのメソッドです。 Encodeモジュールを使って文字コードの変換をするときは、from_toメソッドで、 Encode::from_to($value,"utf-8","euc-jp"); とするのが正しいです。 ------------------------------------------------ これを踏まえて。 「~」「-」「 」が正しく変換されない理由は、Encodeによるものではないと思われます。 上記文字はベンダ依存文字で、元のコードからUTF-8にどうマッピングするかは文字コードを変換するプログラムの実装次第です。 たとえば、Windowsのブラウザ(shift-jis)からUTF-8に変換し、そのUTF-8を別のシステムでEUC-JPに再度変換するとコードポイントが異なるため文字化けが発生する可能性があります。 Perlでも内部で扱う文字変数を入出力すべてUTF-8で扱うようにすれば文字化けは起こらなくなります。 が、それでも後で別の文字コードに変換しようとすると文字化けする可能性があります。(変換プログラム次第) どうしてもEUC-JPを使いたい場合、自ら変換表を書くのが一番確実かも?と思います。 決定的な解決策は示せませんが、ご参考までに。

参考URL:
http://www.pure.ne.jp/~learner/program/Perl_unicode.html
qowop
質問者

お礼

twinkleluz様、丁寧なご返答ありがとうございます。 色々と分からないことが多かったので、しばらく教えていただいたことについて調べてみたのですが、 http://lists.sourceforge.jp/mailman/archives/tcltkjp-develop/2002-November/000015.htmlを見て、ようやく理解しました。 EUC-JPに固執するより、UTF-8で処理するよう検討してみた方が良いのかもしれませんね。 有用な情報感謝いたします。 ありがとうございました。

その他の回答 (1)

回答No.1

Perl 5.8 で、プログラムそのものは euc-jp で書いてあって標準入力と標準出力を utf8 にしたいのであればこれを最初の方で指定するだけでいいと思いますよ。 use encoding 'euc-jp', STDIN => 'utf8', STDOUT => 'utf8'; use Encode; や encode(), decode() による変換は不要です。 注: 「~」などの変換についてはこれでいいかどうか分かりません。

qowop
質問者

お礼

noboru2000様、ご返答ありがとうございます。 ご指摘いただいた方法で試してみたのですが、全ての文字が「????」などと表示されてしまいました。 「use encoding」についてもう少し勉強してみます。

関連するQ&A