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