[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[cvs-ml 768] Re: [cvs-ml 766] Re: pserver経由で文字化け?



小田です。

----- Original Message -----
From: "Oda Hiroki" <oda.hiroki@toshiba-tds.co.jp>
To: <cvs-ml@vox.dj.kit.ac.jp>
Sent: Tuesday, September 26, 2000 3:37 PM
Subject: [cvs-ml 760] pserver経由で文字化け?

> ある漢字コードを含むログがpserverを通過すると、
> 文字化けすることがあります。

慣れないデバッガ(gdb)を駆使して追っていったところ、
cvs/ack139/lcode.c の SjisEucCheck() に辿り着きました。

どうやら、漢字コードの判定でSJISと判定され、SJISとしてEUCへの変換が
行なわれているみたいです。

> pserver         pserver
> 通過前の  →    通過後の
> コード          コード
> ===========================
> 0xA1A1    →    0x8ea18ea1
> ...
> 0xA1DF    →    0x8ea18edf

SJISでは、A1〜DFというコードは、半角記号(句読点など)と半角カナを表します。
よって、EUCコードのうち、1バイト目が A1〜DF かつ 2バイト目が A1〜DF のものは、
下記コード判定部分(lcode.c:30-39行目)により、
    sjis == euc == 2
となってしまい、最終的に、
    sjis >= euc ? SJIS : EUC    (lcode.c:57行目)
という判定で、SJISと判断されてしまいます。

==== lcode.c:30-39 ====
if( *ptr < 0xe0 ){
    sjis++;
    if( IsEuc2( ptr[1] ) ){
        step= 2;
        euc+= 2;
        if( IsKana( ptr[1] ) )
            sjis++;
    }
    continue;
}
=======================

> ただ、これらの文字コードを含んでいても化けない場合があります。

1バイト目が A1〜DF であっても、2バイト目が A1〜DF 以外であるものは、
    sjis == 1
    euc  == 2
となって、最終的にEUCと判断されるみたいです。


原因は分かったのですが、解決するには、どうしたらよいのでしょうか?

(当方としては)SJIS半角カナのために、約4000文字のEUC漢字コードを
捨てるわけにもいかないので、最後の判定文を

    sjis > euc ? SJIS : EUC

とするしか、ないんでしょうか?

(こうすると、半角英数字 または SJIS半角 のみを含む文字列を、EUCと
 判定してしまうのですが...
 プロジェクトとして、そのようなログを禁止すればOK?)

# Win32版 cvs.exe は、どうやってコンパイルするんだろうか?
  Cygwin を使うんでしょうか?


--
東芝電波システムエンジニアリング(株)
| 第四技術部  技術第三担当
| 小田宏規 (おだひろき)
oda.hiroki@toshiba-tds.co.jp