wwwsrchで文字化けさせないためには?

[上に] [前に] [次に]
mybaby [E-Mail] 2000/06/07(水) 16:18:24
はじめまして。
いつもお世話になっております。

過去の質問の”wwwsrch「写」でエラー?”とも重複するのですが,
自分であれこれ調査してもどうしてもわからないことがあります。
以下のとおりです。

環境:win98 pws perl5.6(jperl未導入)jcode.pl2.11

1.入力文字の文字化け
ある文字を入力すると,文字化けして返されます。
1-1.”写”のパターン
 原因:&jcode'convert(*xxx, "euc");では、eucに変換されない。
 対策:入力文字コードを指定すれば変換可能。
    例)&jcode'convert(*xxx, "euc", $kcode_cgi);
1-2.”魁鼻丙蠅竜貶源泱C離僖拭璽
 原因:&jcode'convert(*xxx, "euc");では、eucに変換されない。
    入力文字コードを指定しても変なコードに変換される。
 対策:wwwsrch.cgiをeucにして、文字コード変換しない。

 私も,結局wwwsrch.cgiをeucにして対応しました。しかし,とほほさんでは、
 sjisにもかかわらず,これらの問題発生していません。何が違うのでしょうか?

2.検索結果の文字化け
実際には合致してないのに出力され、検索結果が文字化けする。
 原因:全角文字の後半1バイトと次の文字の1バイトが偶然一致したときに発生?

 これは、jperlを使用しないと回避できない問題なのでしょうか?

以上よろしくお願いします。

mybaby 2000/06/07(水) 16:27:35
1-2で文字化けしちゃいました。
ここの記述は,以下のようになっています。
1-2.”字化け原因文字”(崎の旧文字)のパターン
この字化け原因文字は,sjisのfab1です。(崎の右上部分を,大から立に変えたような文字)

改造クン [E-Mail] [HomePage] 2000/06/07(水) 18:38:51
じゃあ、文字コードがEUCになっているのをSJISにしてはどうでしょうか?
僕のページではSJISにしています。
やり方は、wwwsrch.cgiをメモ帳かなんかで開いてEUCと記述されているところをすべてSJISに変えるだけです。
ぼくは、うまくいっていますが、ほかの人ではどうかわかりません。
まー機会があったら試してください。

sadahiro 2000/06/07(水) 23:05:52
わたしのところ(Win98 + ActivePerl522 + httpd123b + jcode.pl 2.10)
では「写」のエラーが出せないのでよくわからないのですが。
(wwwsrch.cgiのエンコードをsjisにしてもeucにしても化けない)

>原因:&jcode'convert(*xxx, "euc");では、eucに変換されない。
もeucの「写」に変換されました(jcode.plの自動判定では
半角カナは含まれないものとされる/無視するはずだったかと)。

>原因:全角文字の後半1バイトと次の文字の1バイトが偶然一致したときに発生?
大崎氏の解説を参考に http://www.din.or.jp/~ohzaki/index.htm
わたしは次のようにしています。

# 検索語が見つからないなら次の行
unless ($line =~ /$word/i) {next}

# マッチの再検証
if ($match_re && $word =~ /[\x80-\xFF]/) {
next unless $line =~ /^($ascii|$twoBytes|$threeBytes)*$word/i;
}

$ascii, $twoBytes, $threeBytesは大崎氏の所に示されていたとおり
$match_re は再検証するか否かのスイッチとして。
$word =~ /[\x80-\xFF]/ は
$word !~ /[\x00-\x7F]/ でもいいかと思いますが勇気がないので。

mybaby [E-Mail] 2000/06/08(木) 15:58:15
ご返答ありがとうございます。

To:改造クン
ご指摘のとおりSJISにして処理すれば、入力文字の文字化けは問題解決しました。
しかし、ご存知のとおりperlでSJISの文字を扱うには、様々な問題があります。
今後のためにもperlでは、eucにて処理したいと考えています。
また、”シフ”(半角)で検索すると”写”になります。(半角カナを使用すること自体が問題ですが・・・)

To:sadahiro様
>>原因:&jcode'convert(*xxx, "euc");では、eucに変換されない。
>もeucの「写」に変換されました(jcode.plの自動判定では
>半角カナは含まれないものとされる/無視するはずだったかと)。
convert()の第3引数が省略された場合には、内部でgetcode()を自動的に呼び出し、エンコードを判断するそうです。
そこで”写”(SJIS)のエンコードをgetcode()で判断させたところ、undefが返されました。
例)$kcode = &jcode'getcode(*word);
また、”松ア”(アは半角)はeuc、”崎の旧字”は、undefを返します。
sadahiroさんの環境では、これらの問題は、発生しないのでしょうか?

この問題の根本は、”getcode()の限界”にあるような気がします。

>2.検索結果の文字化け
この件はお陰様で解決しました。
ありがとうございました。
大崎さんのPerlメモは、素晴らしいですね。

※最初のメールアドレスは、間違っていました。
 申し訳ありません。

sadahiro 2000/06/08(木) 20:18:49
>mybaby様
'写'は(2,"sjis")を、'松ア'(アは半角)は(2,undef)を、
"\xFA\xB1"(どうもMS-IMEでは文字が出ないような…)は(0,undef)を返しました。
どうも結果が違うところがあるようですね。

>この問題の根本は、”getcode()の限界”にあるような気がします。
同感です。

sadahiro [E-Mail] [HomePage] 2000/06/08(木) 22:38:27
わかりました。「写」のエラーを再現できました。
問題はjcode.plのバージョンによるようです。
わたしが使っていたのはv2.6だったようです(/Perl/libに入れていたから)
v2.6ではgetcodeにEUC半角カナを考慮しません。
v2.10やv2.11ではEUC半角カナといわゆる補助漢字(3バイト)を考慮します。

とほほさんはv2.6を同梱していましたので、
そちらに替えてみることをお奨めします。

mybaby [E-Mail] 2000/06/09(金) 11:27:28
ブラウザのエンコードをeucにして崎の旧文字を以下に入力してみます。



mybaby [E-Mail] 2000/06/09(金) 14:04:08
[[解決]]
>わかりました。「写」のエラーを再現できました。
>問題はjcode.plのバージョンによるようです。
お時間を割いてご検証いただいてありがとうございます。(申し訳ありません)
こちらでもv2.6を使用したところ”写”は、文字化けしなくなりました。
これでこの問題は、ほぼ解決です。

ところで”普h(sjis:fab1)の件ですが
sjisでは、2種類のコードが存在するようです。
●sjis:ed95 → euc:f9f5 (第2水準)
●sjis:fab1 → euc:なし (IBM拡張文字?)
私の環境で”普hをブラウザから送ると、sjis:fab1の方で送信されeucに変換できません。
eucで送るとeuc:f9f5の方で送信されてsjisにも変換できます。
(この投稿もブラウザのエンコードをeucにして送っています。)

結局、現在の文字コード体系ではどんな対応をしても多少の問題があるようですね。
使用目的にもよるとは思いますが、ある程度で”妥協”すべきだと感じました。


改造クン、sadahiroさんありがとうございました。

[上に] [前に] [次に]