[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