OSDN Git Service

* Add option --enable-round-trip.
authorNARUSE, Yui <naruse@users.sourceforge.jp>
Thu, 5 Jan 2006 17:45:32 +0000 (17:45 +0000)
committerNARUSE, Yui <naruse@users.sourceforge.jp>
Thu, 5 Jan 2006 17:45:32 +0000 (17:45 +0000)
  With this option, don't convert characters that can't secure round trip
  conversion in Unicode to JIS.
* Fix: don't ignore ZERO WIDTH NO-BREAK SPACE that isn't BOM.
* Fix: reset strict_mapping_f and disable_cp932ext_f
* Fix: nkf_test.pl

nkf.c
nkf_test.pl

diff --git a/nkf.c b/nkf.c
index e1a3cd5..1c1c326 100644 (file)
--- a/nkf.c
+++ b/nkf.c
@@ -39,7 +39,7 @@
 **        E-Mail: furukawa@tcp-ip.or.jp
 **    \e$B$^$G8fO"Mm$r$*4j$$$7$^$9!#\e(B
 ***********************************************************************/
-/* $Id: nkf.c,v 1.86 2005/12/09 03:18:40 naruse Exp $ */
+/* $Id: nkf.c,v 1.87 2006/01/05 08:45:32 naruse Exp $ */
 #define NKF_VERSION "2.0.5"
 #define NKF_RELEASE_DATE "2005-12-08"
 #include "config.h"
@@ -312,8 +312,14 @@ STATIC  int     s_iconv PROTO((int c2,int c1,int c0));
 STATIC  int     s2e_conv PROTO((int c2, int c1, int *p2, int *p1));
 STATIC  int     e_iconv PROTO((int c2,int c1,int c0));
 #ifdef UTF8_INPUT_ENABLE
+/* don't convert characters when the mapping is not defined in the standard */
 STATIC  int     strict_mapping_f = TRUE;
+/* disable NEC special, NEC-selected IBM extended and IBM extended characters */
 STATIC  int     disable_cp932ext_f = FALSE;
+/* ignore ZERO WIDTH NO-BREAK SPACE */
+STATIC  int     ignore_zwnbsp_f = TRUE;
+/* don't convert characters that can't secure round trip convertion */
+STATIC  int     unicode_round_trip_f = FALSE;
 STATIC  void    encode_fallback_html PROTO((int c));
 STATIC  void    encode_fallback_xml PROTO((int c));
 STATIC  void    encode_fallback_java PROTO((int c));
@@ -1000,6 +1006,7 @@ struct {
     {"utf16-input", "W16"},
     {"disable-cp932ext", ""},
     {"strict-mapping", ""},
+    {"enable-round-trip",""},
 #endif
 #ifdef UNICODE_NORMALIZATION
     {"utf8mac-input", ""},
@@ -1319,6 +1326,10 @@ options(cp)
                    disable_cp932ext_f = TRUE;
                     continue;
                 }
+               if (strcmp(long_option[i].name, "enable-round-trip") == 0){
+                   unicode_round_trip_f = TRUE;
+                   continue;
+               }
                 if (strcmp(long_option[i].name, "fb-skip") == 0){
                    encode_fallback = NULL;
                     continue;
@@ -2208,6 +2219,14 @@ kanji_convert(f)
     module_connection();
     c2 = 0;
 
+    if(input_f == SJIS_INPUT
+#ifdef UTF8_INPUT_ENABLE
+       || input_f == UTF8_INPUT || input_f == UTF16BE_INPUT
+#endif
+      ){
+       is_8bit = TRUE;
+    }
+
 
     input_mode = ASCII;
     output_mode = ASCII;
@@ -2788,6 +2807,13 @@ w_iconv(c2, c1, c0)
 {
     int ret = 0;
     
+    /* throw away ZERO WIDTH NO-BREAK SPACE (U+FEFF) */
+    if(ignore_zwnbsp_f){
+       ignore_zwnbsp_f = FALSE;
+       if(c2 == 0xef && c1 == 0xbb && c0 == 0xbf)
+           return 0;
+    }
+    
     if (c2 == 0) /* 0x00-0x7f */
        c1 &= 0x7F; /* 1byte */
     else if (c0 == 0){
@@ -2816,9 +2842,7 @@ w_iconv(c2, c1, c0)
                return 0;
        }else return 0;
     }
-    if (c2 == 0 || c2 == EOF);
-    else if (c2 == 0xef && c1 == 0xbb && c0 == 0xbf) {
-       return 0; /* throw BOM */
+    if (c2 == 0 || c2 == EOF){
 #if defined(UTF8_OUTPUT_ENABLE) && defined(UTF8_INPUT_ENABLE)
     } else if (internal_unicode_f && (output_conv == w_oconv || output_conv == w_oconv16)){
        unsigned short val = 0;
@@ -2925,12 +2949,16 @@ w_iconv16(c2, c1, c0)
 {
     int ret = 0;
 
-    if (c2==0376 && c1==0377){
-       utf16_mode = UTF16BE_INPUT;
-       return 0;    
-    } else if (c2==0377 && c1==0376){
-       utf16_mode = UTF16LE_INPUT;
-       return 0;    
+    /* throw away ZERO WIDTH NO-BREAK SPACE (U+FEFF) */
+    if(ignore_zwnbsp_f){
+       ignore_zwnbsp_f = FALSE;
+       if (c2==0376 && c1==0377){
+           utf16_mode = UTF16BE_INPUT;
+           return 0;
+       }else if(c2==0377 && c1==0376){
+           utf16_mode = UTF16LE_INPUT;
+           return 0;
+       }
     }
     if (c2 != EOF && utf16_mode == UTF16LE_INPUT) {
        int tmp;
@@ -2941,11 +2969,10 @@ w_iconv16(c2, c1, c0)
        return 0;
     }else if((c2>>3)==27){ /* surrogate pair */
        return 1;
-    }
-#if defined(UTF8_OUTPUT_ENABLE) && defined(UTF8_INPUT_ENABLE)
-    if (internal_unicode_f && (output_conv == w_oconv || output_conv == w_oconv16));
+#ifdef UTF8_OUTPUT_ENABLE
+    }else if (internal_unicode_f && (output_conv == w_oconv || output_conv == w_oconv16)){
 #endif
-    else ret = w16e_conv(((c2<<8)&0xff00) + c1, &c2, &c1);
+    }else ret = w16e_conv(((c2<<8)&0xff00) + c1, &c2, &c1);
     if (ret) return ret;
     (*oconv)(c2, c1);
     return 0;
@@ -3006,6 +3033,33 @@ unicode_to_jis_common(c2, c1, c0, p2, p1)
             }
        }
     }else if(c0){
+       if(unicode_round_trip_f){
+           switch(c2){
+           case 0xE2:
+               switch(c1){
+               case 0x80:
+                   if(c0 == 0x95) return 1;
+                   break;
+               case 0x88:
+                   if(c0 == 0xA5) return 1;
+                   break;
+               }
+               break;
+           case 0xEF:
+               switch(c1){
+               case 0xBB:
+                   if(c0 == 0xBF) return 1;
+                   break;
+               case 0xBC:
+                   if(c0 == 0x8D) return 1;
+                   break;
+               case 0xBF:
+                   if(0xA0 <= c0 && c0 <= 0xA5) return 1;
+                   break;
+               }
+               break;
+           }
+       }
        if(!ms_ucs_map_f){
            /* eucJP-ascii */
            if(c2 == 0xE2 && c1 == 0x80 && c0 == 0xBE){
@@ -5246,6 +5300,10 @@ reinit()
     unicode_bom_f = 0;
     w_oconv16_LE = 0;
     ms_ucs_map_f = FALSE;
+    strict_mapping_f = TRUE;
+    disable_cp932ext_f = FALSE;
+    ignore_zwnbsp_f = TRUE;
+    unicode_round_trip_f = FALSE;
     encode_fallback = NULL;
     unicode_subchar  = '?';
 #endif
index 6421712..dbb66fe 100644 (file)
@@ -2,7 +2,7 @@
 #
 # nkf test program for nkf-2
 #
-# $Id: nkf_test.pl,v 1.13 2005/11/06 20:17:42 naruse Exp $
+# $Id: nkf_test.pl,v 1.14 2006/01/05 08:45:32 naruse Exp $
 #
 #    Shinji KONO <kono@ie.u-ryukyu.ac.jp>
 # Sun Aug 18 12:25:40 JST 1996
@@ -356,11 +356,11 @@ $example{'x0201.utf'} = unpack('u',<<'eofeof');
 MY86HZ*>2XX*KXX*MXX*OXX*QXX*SXX*LXX*NXX*PXX*RXX*T"N6%J.B+L>^\
 MH>^\HN^\H^^\I.^\I>^\IN^\I^^]@>^]@N^]@^^]A.^]A>^]AN^]APKEA:CH
 MJ)CEC[?OO('OO*#OO(/OO(3OO(7OO+[OO(;OO(KOO(COO(GBB)+OO(OOO)WO
-MO+OOO+WOO9OOO9WOOZ4*Y8V*Z*>2[[VV[[VW[[VX/>^]N>^]NN^]MN^^GN^]
-MM^^^GN^]N.^^GN^]N>^^GN^]NN^^GN.!J`KEC8KHIY+OOHKOOI_OOHOOOI_O
-MOHSOOI_OOHWOOI_OOH[OOI_OO;?OOI_OO;'OOIX*[[Z*[[Z?[[Z+[[Z?[[Z,
-M"FAA;FMA:W4@[[Z*[[Z?[[Z+[[Z?[[Z,[[VD"N^^BN^^G^^^B^^^G^^^C.^^
-2G>^]H0KEC8KHIY+C@:[EOHP*
+MO+OOO+WOO9OOO9W"I0KEC8KHIY+OO;;OO;?OO;@][[VY[[VZ[[VV[[Z>[[VW
+M[[Z>[[VX[[Z>[[VY[[Z>[[VZ[[Z>XX&H"N6-BNBGDN^^BN^^G^^^B^^^G^^^
+MC.^^G^^^C>^^G^^^CN^^G^^]M^^^G^^]L>^^G@KOOHKOOI_OOHOOOI_OOHP*
+M:&%N:V%K=2#OOHKOOI_OOHOOOI_OOHSOO:0*[[Z*[[Z?[[Z+[[Z?[[Z,[[Z=
+1[[VA"N6-BNBGDN.!KN6^C`H`
 eofeof
 
 $example{'x0201.jis'} = unpack('u',<<'eofeof');