perl (EUC)で書かれた問い合わせフォームに

ついて文字化けがありまして、文字コードを調べてみたところ、
治(8ea1)から釈(8edf)までの2バイト文字が、
。(a1)から゜(df)までの1バイト文字に置き換わっていることがわかりました。
phpの類似情報を見つけましたが、perlで考えられる原因を教えてください。

文字変換に関わる部分を抜粋します。

($name, $value) = split(/=/, $pair);
$name =~ tr/+/ /;
$name =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
$value =~ tr/+/ /;
$value =~ s/%([a-fA-F0-9][a-fA-F0-9])/pack("C", hex($1))/eg;
if (!($value =~ /\n/) && $value =~ /\r/) { $value =~ s/\r/\n/g; }

&jcode::h2z_sjis(\$value);
&jcode'convert(*name,'euc');
&jcode'convert(*value,'euc');


またhttpd.conf等の設定ファイルを変更すれば問題は解消するのでしょうか?

回答の条件
  • URL必須
  • 1人2回まで
  • 登録:
  • 終了:2007/04/12 19:14:08
※ 有料アンケート・ポイント付き質問機能は2023年2月28日に終了しました。

回答3件)

id:b-wind No.1

回答回数3344ベストアンサー獲得回数440

ポイント27pt

Perl で url エンコードと url デコード

pack の引数は "C" じゃ無くて "H2" じゃ無いんでしょうか。


もっとも、素直に CGI.pm と Jcode.pm を使うほうがいいと思うんですが。

CGI - 簡単なCGI(Common Gateway Interface)クラス

Jcode.pm

id:herolight No.2

回答回数395ベストアンサー獲得回数19

ポイント27pt

&jcode::h2z_sjis(\$value);

↓これが原因ではないかもしれませんが下記にします。

&jcode::h2z_euc(\$value);

今回は関係ありませんが私は下記を参照しています。

http://www.din.or.jp/~ohzaki/perl.htm

id:samejima No.3

回答回数92ベストアンサー獲得回数8

ポイント45pt

シフトJISとEUC-JPの領域が重なっているために自動判定では判定不可能な部分です。

治(8ea1)から釈(8edf)までの2バイト文字
。(a1)から゜(df)までの1バイト文字
これはシフトJIS的な解釈の結果。
EUC-JP的には
8ea1から8edfまではJIS X0201カナ文字。

対策としては
http://mikeneko.creator.club.ne.jp/~lab/kcode/web.html

&jcode::h2z_sjis(\$value);
...
&jcode'convert(*value,'euc');
$valueの文字コードが定まってからh2zをかけないと無意味では。

  • id:lunlumo
     文字化けの原因はsamejimaさんの指摘の通りかと思いますが,紹介されているページの対策ではこの場合不十分です。文字コード判定用に埋め込んだデータから文字コードを取得するか,呼び出し元の文字コードを固定して,変換元の文字コードを明示的に指定してやる必要があります。

    $code = jcode::getcode($code_detect); # or $code='sjis';
    ...
    jcode::convert(\$name,'euc',$code);
    jcode::convert(\$value,'euc',$code);

    > pack の引数は "C" じゃ無くて "H2" じゃ無いんでしょうか。

     hexを併用しているので,ここの処理は正しいでしょう。

    http://www.tohoho-web.com/wwwperl2.htm#pack
    http://www.tohoho-web.com/wwwperl2.htm#hex

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

回答リクエストを送信したユーザーはいません