電子書籍の厳選無料作品が豊富!

perlで細かいことを理解できないままに呪文のように頭に

require 'cgi-lib.pl';
require 'jcode.pl';

を使っていました。
そのうち文字化けなどの問題も出て、いろいろ調べたり質問したりして、jcode.plは古いからJcode.pmを使いなさいと指摘を受けたので、

require 'cgi-lib.pl';
require 'Jcode.pm';

と呪文変更を行いましたが、これについての使い方を理解せぬうちに、use Encode qw(from_to encode);としなさいと指摘を受け、

require 'cgi-lib.pl';
use Encode qw(from_to encode);

と変えて使っていました。
ところが、このパターンを使っていたところ、GETでのデータの受渡がうまくできない(internal server error)となることに気づきました。
2つ目のパターンでも同じでした

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'});
}else{
&error;
}

データの受信はこのようにはじめています。


そもそもJcode.pmやuse Encode qw(from_to encode);というのはjcode.plに変わる日本語変換のパッケージなのでしょうか?

また、

require 'cgi-lib.pl';
require 'jcode.pl';
use Encode qw(from_to encode);

とするとGETでの受渡も問題なかったのですが、2つを混在させても問題ないのでしょうか?
というのも、メール送信で文字変換させるときに
sub jis{
my $msg = $_[0];
Encode::from_to($msg, "shiftjis", "iso-2022-jp");
return $msg;
}
としているので、use Encode qw(from_to encode);がないとEncode::from_to()が使えないのかなと想像し2つをセットで使用しています。(冒頭でuse Encode qw(from_to encode)を宣言し、変換部分でEncode::from_to()を使用)



jcode.pl、Jcode.pm、use Encode qw(from_to encode)、Encode::from_to()の関係について教えてください。
もちろん自分でもネットで調べてみましたが、思うように解説してあるところが見つからず困っています。

A 回答 (1件)

まず、よく使われる日本語関係のライブラリですが、下記の様になります。



----------------------------------------
■ jcode.pl
http://mikeneko.creator.club.ne.jp/~lab/kcode/jc …
対応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 …
http://hikoboshi.org/perl/doc/encode_old.html

Perl 5.8 以降では、入力された文字列は一度内部表現(UTF-8)に直して必要な処理を行い、出力する際にエンコードし直すのがセオリーようです。

この回答への補足

何度もすみません

&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で出力しているので、ちゃんと変換されているのか検証することができず困っております。

補足日時:2011/05/28 17:56
    • good
    • 0
この回答へのお礼

ありがとうございます。
教えて頂いた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を使わず、現在の王道(基本)的な最初の記述のくだりを説明したサイトでもご存じでしたらぜひ教えてください。
よろしくお願いします。

お礼日時:2011/05/28 17:40

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!