Forums: Open Discussion (Thread #9294)

cp932 (2005-11-11 04:54 by naruse #17787)

こんにちは。
改めてskfを試していて気づいた事をいくつか。

まず、NetBSDにおいて-lintlがないためにエラーが出る件が再発しています。

cp932の入力が壊れているようです。
また、出力もIBM拡張漢字の範囲がNEC選定IBM拡張漢字側に変換されています。
詳細なテスト結果は以下においておきました。
http://naruse.biz/dev/result_skf.txt
なお、期待する値は以下を参照しています。
http://search.cpan.org/src/DANKOGAI/Encode-2.12/ucm/cp932.ucm

マニュアルの、
ucs2 UTF-16 転送形式の Unicode(v4.0) である。こ の オ プ
ショ ンは --x0212-enable を含む。入出力は標準ではリ
トルエンディアンで、BOM が --disable-endian を指 定
し ない限り付けられる。また、--limit-to-ucs2 を指定
しない限り、サロゲートペアを用いた UTF-32 範囲の 値
が 出力される。細かいコード設定は以下オプションを参
照のこと。
について、--disable-endian でなく --disable-endian-markではないでしょうか。

コードを見ていてふと気づいたのですが、KINIMOTOを定義していない時、
while (TRUE) から抜けられないような気がします。

Index: skf.c
===================================================================
RCS file: /cvsroot/skf/skf-1.93/skf.c,v
retrieving revision 1.7
diff -u -r1.7 skf.c
--- skf.c 6 Nov 2005 02:26:47 -0000 1.7
+++ skf.c 10 Nov 2005 19:42:08 -0000
@@ -875,7 +875,7 @@
};
#else /* !KUNIMOTO */
us = preConvert (fin); /* character conversion */
- if (us != sEOF) {
+ if (us == sEOF) {
break;
} else if (us == sOCD) {
#ifdef DEBUG

よろしくおねがいします。

RE: cp932 (2005-11-11 22:25 by efialtes #17801)

バグ報告ありがとうございます。

(1) すみません。NetBSD の件は、まだ直していません。NetBSD 環境は VM 上に作ってはあるんですが、他の修正の関係で手が着いてない状況です。
(2) cp932 関係は見ます。他は指摘通りの模様。修正します、というか KUNIMOTO を Default としてスイッチを外す方向で直す予定です。
(3) 他に、今 --disable-dynamic の時にあちこち 1.92 からエンバグしているのが分かっていて、1.94 のバックポート中です。
Reply to #17787

RE: cp932(2) (2005-11-14 00:27 by efialtes #17832)

(1)とりあえず一次レポートです。

U+005c,7e 仕様。というか icu がおかしいと思う。cp932 は 0x00-0x7e は
JIS X-0201 のはず。
U+00A1 仕様。というか icu がおかしいと思う。
U+00A6 調査中
U+00A9,AA,AD,AE 仕様
U+00AF どうするか検討中
U+00B2 - U+00FF 仕様。というか icu がおかしいと思う。
U+041A, U+221A 再現せず。条件を教えてください。
U+2170 - U+2179 仕様。icu のマッピングの意図は分かるが、修正しない。
U+301D どうするか検討中
U+3094 仕様。というか icu がおかしいと思う。
U+4E28 - U+FFE4 仕様。icu のマッピングの意図は分かるが、修正しない。
U+FA1A, U+FF1A 再現せず。条件を教えてください。

cp932 の場合、NEC 外字領域と IBM 外字領域には同じ字がマップされています。skf では NEC 外字を吐くようにしています (IBM 外字に対応しない機種があるため)。Windows 環境下では内部で Unification されるので、問題がないはず。

(2) IBM ebcdic は 1.93 では未サポートにしているので、修正は 1.94 送りにします。
Reply to #17787

RE: cp932 (2005-11-14 07:58 by naruse #17834)


> U+005c,7e 仕様。というか icu がおかしいと思う。cp932 は 0x00-0x7e は
> JIS X-0201 のはず。

確かにIANAの登録では
> The CCS's are JIS X0201:1997, JIS X0208:1997, and these extensions.
となっているのですが、実装を見ても、CP932.txtを見ても、
MicrosoftのWebサイトにあったCP932の情報を見てもASCIIになっています。

CP932がMicrosoftの独自実装であり、それでいてその仕様が固まっているのですから、
それにあわせた方がうれしいかと。

なお実装は以下に調べた結果と用いたコードを。
http://naruse.biz/dev/Unicode_to_cp932.txt
MSのサイトはここです。
http://www.microsoft.com/globaldev/reference/dbcs/932.mspx

> U+00A1 仕様。というか icu がおかしいと思う。
> U+00B2 - U+00FF 仕様。というか icu がおかしいと思う。
> U+3094 仕様。というか icu がおかしいと思う。
実装及びcp932.ucmでは変換されますが、
一方向変換なせいか932.mspxにもCP932.txtにも載ってませんね。。

> U+041A, U+221A 再現せず。条件を教えてください。
> U+FA1A, U+FF1A 再現せず。条件を教えてください。
このテストはWindowsXP SP2 + MSYS + gcc version 3.4.2 (mingw-special)で行ったのですが、
FreeBSD 5.4-RELEASE-p2では再現しませんね・・・。
> perl -e"print qq/\x04\x1a/"|skf --ic=utf-16 --oc=cp932 --input-big-endian|od -t x1
0000000 81 ac
0000002
となります。2byte目が1Aで共通している辺りが妖しいですが、、

> cp932 の場合、NEC 外字領域と IBM 外字領域には同じ字がマップされています。skf では NEC 外字を吐くようにしています (IBM 外字に対応しない機種があるため)。Windows 環境下では内部で Unification されるので、問題がないはず。
仰るとおり、Windowsならば正規化されますし、特別問題になるとは思いませんけれど、
Windowsでは JIS > NEC特殊文字 > IBM拡張文字 > NEC選定IBM拡張文字
の順に優先して変換するので、それにあわせて欲しい気もします。
http://www2d.biglobe.ne.jp/~msyk/charcode/cp932/uni2sjis.html
Reply to #17787

RE: cp932(3) (2005-11-15 00:19 by efialtes #17858)

了解。x0201→ascii, IBM 拡張文字化ほかは patch 8 で修正します。U+00A1 関係は直さないつもり。

∵) (1) cp932 の文字集合に入っていないものの定義はそもそもないはず。これは cp932.txt にないのと整合している。多分不便だからこういうマッピングをしているんでしょうけど
(2) skf は文字集合にないのをみて、実体参照ほかを吐いている手順になっているので、cp932 に閉じる際の問題は緩和されているので、わざわざ違う文字に変換する積極的な理由は乏しい。また、cp932 とはいえ変な文字に変換してしまうと XML で使う際に個人的には不便。

U+041A:Cygwin だと正しいので、mingw 環境が絡んでいるようですねぇ。
Reply to #17787

RE: cp932(3) (2005-11-15 04:07 by naruse #17862)

x0201→ascii, IBM 拡張文字化ほかはありがとうございます。

U+00A1関連は、変換するよりむしろエラーにして欲しいと言う要望は受けた事があるのでわかります。
その辺の動作が欲しい時は、Unicode互換正規化をBlock単位でかけられると事足りるはずなので、そういう機能があると嬉しいです。
Perlのモジュールとして使う場合には特に。
Reply to #17858

RE: cp932(4) (2005-12-11 20:31 by efialtes #18443)

1.93.9 で NetBSD のコンパイルが通らない件は修正しました。
Reply to #17787