[Reference:<_A51@freyasx.ML_>]
Newsgroups: mail-lists.freyasx
[FreyaSX] Re: 文字化けに関して
In message <_A51@freyasx.ML_> on 09/01/05(23:11:08)
you NAOTOSHI DATE <pgmaaappw-mxhgu42nqh3w.ml@delegate.org> wrote:
|伊達と申します。
|FreyaSXをありがたく使わさせていただいております。
|さて、御意見箱に適切な話題かどうかよくわからないのですが、
|freyasx.cgiを実行して、「齊藤」で検索すると、文字化け(?)して
|半角の「s」として検索するようになってしまいます。
|これが、「齊藤太郎」などと入力すると文字化けなしに検索できます。
|ちなみに「斉藤」や「齋藤」ではこの問題はおきません。
...
|ひょっとしたら、私のパソコンでの設定自体に問題があるのかもしれませんが、
|よく分かりません。
|大変お忙しいとは思いますが、この件についてアドバイスをいただければありがたいです。
まず、通常文字化けは、ブラウザの種別やその設定に依存しますので、そのへんの
情報があれば、問題の特定がしやすいと思います。
もし、中間に文字コード変換を行うプロキシ等が介在すれば、その設定にも依存
します。
また、HTTPのリクエストURL中に(ASCIIでない)日本語文字列を送信する際
には、それは %XX という表現に変換されていますので、それを示していただける
と、何が起こっているか理解しやすい(再現実験もしやすい)と思います。
|佐藤様のサイトでこの問題を確認できるかと思いまして、「齊藤」と入力したところ
|文字化けすることなく検索できました。ところが、「斉藤」や「齋藤」をはじめ
|「藤」といういう漢字を含む単語は概ね化けてしまいました。
|( "斉藤" → "タニニ」", "齋藤" → "羚ニ」", "伊藤" → "ーヒニ」",
|"佐藤" → "コエニ」"等)
こちらは再現できました(ブラウザによりません)。起こっているのは以下の
ようなことでした。
・"斉藤" の EUC-JPコーディングの16進表現は、C0C6C6A3 です。
・この、C0C6C6A3 は、EUC-JP における "斉藤" であると同時に、Shift_JIS に
おける(半角の)"タニニ」" でもあります。
・従ってこの文字列だけを与えられた場合に、これをどちらであるかと確実に
判定することはできません。DeleGateの場合には、バージョンにもよりますが、
基本的に Shift_JIS を優先するようになっています。★)
・http://www.delegate.org の入口のHTTPサーバ(リバースプロキシでもある
DeleGate)では、リクエスト中の非ASCII文字コードを変換して内部サーバに
中継します。ここで、FreyaSX のサーバは、別の内部HTTPサーバ(これも
DeleGateですが)で動作していて、http://www.delegate.org/-fsx/* は
そのサーバに中継されます。
・この際、www.delegate.org の入口HTTP サーバは、内部のFreyaSXサーバからの
応答がEUC-JPであることを記憶している(正確には、クライアントのCookieの
中に記録している)ので、それに合わせるために、クライアントからの
リクエストをEUC-JP に変換しようとします。
・具体的には、"斉藤" の検索の場合には、リクエストの URLは
http://www.delegate.org/-fsx/search?key=%C0%C6%C6%A3&index=
となります。入口のHTTPサーバは、この C0C6C6A3 というのが Shift_JIS
で半角の "タニニ」" だと判定して、これを全角の EUC に変換し、
内部のFreyaSXに転送します。
それで、DeleGate における ★)の判定は、インターネットにおける半角の使用が
比較的一般化しつつある?状況においては仕方ないような気がします。
ただ、この場合、中継先のサーバのコード(変換先のコード)がEUCであることが
わかっているわけで、そのような場合入力もEUCである可能性のほうが高いと
思ってもよいはずです。というわけで、EUC / Shift_JIS どちらとも判別でき
ない場合に、入力が変換先のコード(EUC)と一致すると解釈できるなら、そちらの
判定を優先する、というようにDeleGateの実装を、同封のパッチのように変更
しました。
ということで www.delegate.org での上記の字化けは発生しなくなったと思います。
なお、上記の入口DeleGateで行っていること(文字コード変換付きリバース
プロキシ)は、以下のような設定で実現しています。
MOUNT="/-fsx/search* http://freya-sx/cgi-bin/fsearch/fsearch.cgi*"
MOUNT="/-fsx/* http://freya-sx/cgi-bin/fsearch/*"
CHARSET=guess
ここで、MOUNT は、FreyaSX用のHTTPサーバ、
http://freya-sx/cgi-bin/fsearch/fsearch.cgi?*
に対して、
http://delegate/-fsx/search?*
のようにアクセスできるようにするための仕掛けです。また、
CHARSET=guess
は、もともと、サーバからの応答に文字コード情報が無かった場合に、DeleGate
が推定した文字コード情報を付加してクライアントに送るだけの機能でした。
最近の拡張で、CHARSET=... という文字コード変換・推定のための指定がされて
いる場合、サーバからの文字コードをクライアント向けのCookie中に記録して、
これを利用してクライアントからのサーバ向けのデータを変換するようになり、
CHARSET=guess の場合にも、これが適用されています(ということに気が付きま
した)
なお、FreyaSX 自体は、EUC-JP しか入力・出力できません。通常はほぼ自動的に
クライアントがこれに合わせてくれるのですが、クライアントがEUC-JP 以外で
問い合わせをして来た場合とか、途中に何かの文字コード変換があったりする
場合に自動的に対応するために、DeleGateでの文字コード変換が挟まっています。
D G
┌─┐┬┌──┬┐ //\^^ ( - ); {Do the more with the less -- B. Fuller}
├─┤│└─┐│ / 877m\_< >_ <URL:http://www.delegate.org/delegate/>
┴ └┴──┘┴──────────────────────────────
佐藤豊@情報技術研究部門.産業技術総合研究所(独立行政法人)
*** ../delegate9.0.5-pre5/rary/JIS.c Thu Sep 15 06:03:51 2005
--- rary/JIS.c Mon Sep 26 13:26:24 2005
***************
*** 638,643 ****
--- 638,647 ----
/* long indistinguish SJIS is not likely to be */
if( CC_BEEUC < nJ8 )
cs = CC_EUCJP;
+ else
+ if( ccx->cc_OUT == CC_EUCJP ){
+ cs = CC_EUCJP;
+ }
else cs = CC_SJIS;
}
}
|