- ベストアンサー
Perlの日本語文字コードはどうすべき?
- Perlでの日本語文字コードについてそれぞれのモジュールや関数の使い方について調べたが、混在して使用する際に問題が生じることがあった。
- Jcode.pmやuse Encode qw(from_to encode)はjcode.plに代わる日本語変換のパッケージであるが、使用する際に注意が必要である。
- また、メール送信での文字変換にEncode::from_to()を使用するが、その際にはuse Encode qw(from_to encode)が必要である。
- みんなの回答 (1)
- 専門家の回答
質問者が選んだベストアンサー
まず、よく使われる日本語関係のライブラリですが、下記の様になります。 ---------------------------------------- ■ jcode.pl http://mikeneko.creator.club.ne.jp/~lab/kcode/jcode.html 対応Ver. : Perl4以降 対応文字コード : JIS(ISO-2022-JP), EUC-JP, シフトJIS 歌代和正さんによる日本語コード変換ライブラリ。 ■ Jcode.pm http://openlab.jp/Jcode/index-j.html 対応Ver. : Perl5以降 対応文字コード : JIS(ISO-2022-JP), EUC-JP, シフトJIS, UTF-8, UCS-2 小飼弾さんによる日本語コード変換ライブラリ。jcode.pl の後継を意図? ■ Encode.pm http://search.cpan.org/dist/Encode/Encode.pm 対応Ver. : Perl5.8以降 対応文字コード : JIS(ISO-2022-JP), EUC-JP, シフトJIS, UTF-8, UTF-16, etc... Jcode.pm と同じく小飼弾さんによる文字コード変換ライブラリ。Perlの標準ライブラリに含まれる。Jcode.pm の後継。 ---------------------------------------- > とするとGETでの受渡も問題なかったのですが、2つを混在させても問題ないのでしょうか? おそらく、jcode.plに含まれる関数を使っている箇所が残っていて、たまたま GET リクエストがあった際にそこを通ったのではないかと。 混在させることでエラーが発生したり誤動作することは無いと思われますが、混乱の元ですので jcode.pl の関数を使っている部分を書き換えた方が良いでしょう。 下記の行をスクリプトの中に入れれば、Internal server error の内容がブラウザに表示されるとおもいます。 use CGI::Carp qw(fatalsToBrowser); ※ エラーの情報がダダ漏れになりますので、外部に公開されていないサーバなどで試して下さい。また、修正し終わったらこの行は取り除いてください。 Perl 5.8 以降は、内部表現がUTF-8になるなど文字列全般の扱いが大きく変わったので、仕様をよく確認しておいた方が良いです。下記のサイトなどに詳しく説明されています。 http://hikoboshi.org/perl/utf8.html http://www.rwds.net/kuroita/program/Perl_unicode.html http://hikoboshi.org/perl/doc/encode_old.html Perl 5.8 以降では、入力された文字列は一度内部表現(UTF-8)に直して必要な処理を行い、出力する際にエンコードし直すのがセオリーようです。
お礼
ありがとうございます。 教えて頂いた3つのサイトは読んだことありますが、全くの無知状態でフリーのコードを睨めっこしてperlを少しずつ使えるようになった経緯から、プログラムの基本が全く分かってなくって、なかなか説明を理解することができておりません。 (特に冒頭部分などは呪文のように一塊の処理を頭ごなしに記憶している状態です) use CGI::Carp qw(fatalsToBrowser); 教えて頂いたこのコードでエラーヶ所を探してみたところ、データを受けた後分解する際にforeachの中で &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); がjcode.plの構文だったようで、ここで引っかかっていました。 そこをコメントアウトし、 #!/usr/bin/perl require 'cgi-lib.pl'; use Encode qw(from_to encode); local($key,$val); undef(%in); &ReadParse; my($method) = $ENV{'REQUEST_METHOD'}; if ($method eq "GET"){ $QUERY_DATA = $ENV{'QUERY_STRING'}; }elsif ($method eq 'POST'){ read(STDIN, $QUERY_DATA, $ENV{'CONTENT_LENGTH'}); } @pairs = split(/&/,$QUERY_DATA); foreach $pair(@pairs) { ($name,$value) = split(/=/,$pair); $value =~ tr/+/ /; $value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; $name =~ tr/+/ /; $name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C",hex($1))/eg; #&jcode'convert(*name,'sjis'); #&jcode'convert(*value,'sjis'); $in{$name} = $value; } としてみたところ、とりあえずPOSTでもGETでもエラーなくshift-jisのファイルを読み込んでshift-jis形式でhtml出力をしてくれていますが、やはりこれはあくまでも入力時も出力時も変換されずに読み出し書き出ししているということになるのですよね? このperl(cgi)ファイルもwindows上のテキストアプリで作ってますので、shift-jis形式だとは思うのですが・・・おっしゃっておられるセオリーに合わせるならperlファイルもUTF-8で記述できるテキストアプリケーションを使って、入力時、出力時ともに変換すべきなのでしょうか。 とすると、どこでどのようにUTF-8にエンコードしてやればいいのでしょうか? すごく初歩中の初歩のことを聞いて恐縮ですが、ネットでPOSTやGETデータを受信して内部処理として使えるようにする記述例を探しても、まとまって記述されている物はどれもjcode.plを使っているものばかりで、Encodeで記述の最初(#!usr/bin/perl)からデータのデコードまでを記述されたサイトが見つからず、流れとしてどうやって記述していいのか分かりません。 jcode.plやJcode.pmを使わず、現在の王道(基本)的な最初の記述のくだりを説明したサイトでもご存じでしたらぜひ教えてください。 よろしくお願いします。
補足
何度もすみません &jcode'convert(*name,'sjis'); &jcode'convert(*value,'sjis'); が、jcode.plでの文字変換でエラーだと気づいたと書きましたが、Encodeの場合だと Encode::from_to($name, "shiftjis", "cp932"); Encode::from_to($value, "shiftjis", "cp932"); でいいのでしょうか? 基本的に現在、shift-jisのファイルをshift-jis形式で作ったperlファイルで操作し、shift-jis形式のhtmlで出力しているので、ちゃんと変換されているのか検証することができず困っております。