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()の関係について教えてください。
もちろん自分でもネットで調べてみましたが、思うように解説してあるところが見つからず困っています。
No.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で出力しているので、ちゃんと変換されているのか検証することができず困っております。
ありがとうございます。
教えて頂いた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を使わず、現在の王道(基本)的な最初の記述のくだりを説明したサイトでもご存じでしたらぜひ教えてください。
よろしくお願いします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Perl Perl の外部モジュールの利用方法 3 2022/07/10 18:34
- その他(プログラミング・Web制作) python fbprophetについて 1 2022/09/29 19:44
- 英語 この英語の問題が分かりません 3 2023/04/22 20:19
- その他(SNS・コミュニケーションサービス) 自分のpcがハッキングされたようなメールが来たのですがどうすればいいですか? 4 2022/10/02 16:14
- TOEFL・TOEIC・英語検定 TOEICの問題について質問です!! Moreover, a portion of the proc 3 2022/09/05 17:12
- 英語 The Twilight Zone1959に関するCBSの回答について 1 2023/03/02 15:13
- SQL Server クエリで、日付が逆転したときは、二日分になるクエリを書きたいです。 4 2022/07/12 22:21
- TOEFL・TOEIC・英語検定 英検3級のライティングに関して質問があります。 定型パターンを何個か覚えておこうと考え下記を見つけま 6 2022/08/28 06:20
- 英語 海外から返金 1 2022/06/30 08:20
- 英語 The superior extent of a sloping anterior wall may 3 2023/03/09 13:55
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
perlの日本語文字コードはどう...
-
javaでエンコードがうまくいかない
-
CSVファイルの中で、「 , 」カ...
-
住宅にカナを入力する際に丁目...
-
英数字のみ全角から半角に変換
-
CSVの定義
-
マクロを使ってフォルダー内に...
-
EXCELからCSVにすると余計なカ...
-
csvデータ ダブルクォーテ...
-
エクセルで数値を全角文字(カ...
-
文字コードの%E3%80%とは何です...
-
Malformed UTF-8 character
-
InputMan の imTextについて
-
PHP カンマをエスケープしたい...
-
VBA 置換文字がみつからない時
-
全角スペースを削除するには?
-
大文字と全角文字は同じ意味で...
-
COBOLでの全角文字の判定をした...
-
ACCESSの表で罫線を使うと縦方...
-
角カッコが含まれてるかどうか...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
IMAP4でsubjectが検索ヒットしない
-
CASLIIの数値データ入出力
-
pythonエラー
-
BASP21によるbase64のデコード...
-
「繝・せ繝・」となる文字化け
-
jisコードで16進数の『3c』か...
-
URLエンコードされたデータを戻...
-
1つのサイトで文字コードが混在...
-
perlの日本語文字コードはどう...
-
Encodeモジュールで日本語化したい
-
Lite.pmを使ったメールで文字化け
-
Perlでのメール本文の解析について
-
Cookie変数の命名について
-
Perl:ファイル名だけ文字化けする
-
MIMEでエンコードされたMailのS...
-
javaでエンコードがうまくいかない
-
Perl 文字化け
-
メール(iso-2022-jp-2)のデコ...
-
index関数で日本語を使用する場...
-
メールを文字化けしないように...
おすすめ情報