人力検索はてな
モバイル版を表示しています。PC版はこちら
i-mobile

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等の設定ファイルを変更すれば問題は解消するのでしょうか?

●質問者: wm107p
●カテゴリ:インターネット ウェブ制作
✍キーワード:A1 DF EUC FA httpd
○ 状態 :終了
└ 回答数 : 3/3件

▽最新の回答へ

1 ● b-wind
●27ポイント

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

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


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

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

Jcode.pm


2 ● herolight
●27ポイント

&jcode::h2z_sjis(\$value);

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

&jcode::h2z_euc(\$value);

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

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


3 ● samejima
●45ポイント

シフト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をかけないと無意味では。

関連質問


●質問をもっと探す●



0.人力検索はてなトップ
8.このページを友達に紹介
9.このページの先頭へ
対応機種一覧
お問い合わせ
ヘルプ/お知らせ
ログイン
無料ユーザー登録
はてなトップ