Article freyasx/55 of [1-99] on the server localhost:7119
  upper oldest olders older1 this newer1 newers latest
search
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
[Reference:<_A51@freyasx.ML_>]
Newsgroups: mail-lists.freyasx

[FreyaSX] Re: 文字化けに関して
26 Sep 2005 06:32:43 GMT ysato@delegate.org (Yutaka Sato)
The DeleGate Project

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;
  			}
  		}

  admin search upper oldest olders older1 this newer1 newers latest
[Top/Up] [oldest] - [Older+chunk] - [Newer+chunk] - [newest + Check]
@_@V