Citrus iconv (4)
というわけで、さっそく先日の森山さんによるパッチによって、CP932関連の互換性がだいぶ改善されたCitrus iconvを改めてテストしてみました。現在のnetbsd-currentでのテスト結果です。
Unicode to cp932 Convertion Test corrrect: 9359 failed: 1 U+3094: 0x8394 is expected, but 0x81ac (HIRAGANA LETTER VU) cp932 to Unicode Convertion Test corrrect: 9757 failed: 0 Unicode to eucJP-ms Convertion Test corrrect: 15074 failed: 5 U+2014: 0xa1bd is expected, but 0xa2ae (EM DASH) U+2016: 0xa1c2 is expected, but 0xa2ae (DOUBLE VERTICAL LINE) U+203e: 0x7e is expected, but 0xa2ae (OVERLINE) U+2212: 0xa1dd is expected, but 0xa2ae (MINUS SIGN) U+301c: 0xa1c1 is expected, but 0xa2ae (WAVE DASH) eucJP-ms to Unicode Convertion Test corrrect: 15098 failed: 0
気づいた事。
- いくらひらがなの「う”」が無いからって、カタカナの「ヴ」にしているのはどうなのだろうと思う。(CP932.txtにはこの変換は定義されていないし)しかし、ゲタになるよりはいいのかも。
- テストしてから気づいたのだけれど、eucJP-ms.ucmってUnicode->CP51932において、重複符号化文字を多対一変換してるのね。この辺はeucJP-msとしては定義されていないようだけれど、どうなのだろうか・・・。
とりあえず、これに対するパッチ
Index: citrus_euc.c =================================================================== RCS file: /cvsroot/src/lib/libc/citrus/modules/citrus_euc.c,v retrieving revision 1.9 diff -u -r1.9 citrus_euc.c --- citrus_euc.c 18 Oct 2005 06:42:12 -0000 1.9 +++ citrus_euc.c 23 Oct 2005 11:04:25 -0000 @@ -325,6 +325,13 @@ } m = (cs) ? 0x80 : 0x00; switch (cs) { + case 1: + if(nm < 0xff) { + *s++ = nm; + *nresult = (size_t)1; + return 0; + } + break; case 2: *s++ = _SS2; i--;
Index: UCS%JISX0208@MS.src =================================================================== RCS file: /cvsroot/src/share/i18n/csmapper/JIS/UCS%JISX0208@MS.src,v retrieving revision 1.1 diff -u -r1.1 UCS%JISX0208@MS.src --- UCS%JISX0208@MS.src 19 Jul 2003 20:20:42 -0000 1.1 +++ UCS%JISX0208@MS.src 23 Oct 2005 06:20:23 -0000 @@ -135,7 +135,9 @@ 0x044F = 0x2771 0x0451 = 0x2757 0x2010 = 0x213E +0x2014 = 0x213D 0x2015 = 0x213D +0x2016 = 0x2142 0x2018 = 0x2146 0x2019 = 0x2147 0x201C = 0x2148 @@ -148,6 +150,7 @@ 0x2032 = 0x216C 0x2033 = 0x216D 0x203B = 0x2228 +0x203E = 0x007E 0x2103 = 0x216E 0x212B = 0x2272 0x2190 = 0x222B @@ -162,6 +165,7 @@ 0x2207 = 0x2260 0x2208 = 0x223A 0x220B = 0x223B +0x2212 = 0x215D 0x221A = 0x2265 0x221D = 0x2267 0x221E = 0x2167 @@ -261,6 +265,7 @@ 0x3013 = 0x222E 0x3014 = 0x214C 0x3015 = 0x214D +0x301C = 0x2141 0x3041 = 0x2421 0x3042 = 0x2422 0x3043 = 0x2423 @@ -344,6 +349,7 @@ 0x3091 = 0x2471 0x3092 = 0x2472 0x3093 = 0x2473 +0x3094 = 0x2574 0x309B = 0x212B 0x309C = 0x212C 0x309D = 0x2135