OSDN Git Service

--fb-java doesn't follow java's spec
[nkf/nkf.git] / nkf.c
diff --git a/nkf.c b/nkf.c
index 8d02923..f6a25dd 100644 (file)
--- a/nkf.c
+++ b/nkf.c
@@ -1111,18 +1111,26 @@ encode_fallback_java(nkf_char c)
     (*oconv)(0, '\\');
     c &= VALUE_MASK;
     if(!nkf_char_unicode_bmp_p(c)){
-       (*oconv)(0, 'U');
-       (*oconv)(0, '0');
-       (*oconv)(0, '0');
-       (*oconv)(0, bin2hex(c>>20));
-       (*oconv)(0, bin2hex(c>>16));
+        int high = (c >> 10) + NKF_INT32_C(0xD7C0);   /* high surrogate */
+        int low = (c & 0x3FF) + NKF_INT32_C(0xDC00); /* low surrogate */
+       (*oconv)(0, 'u');
+       (*oconv)(0, bin2hex(high>>12));
+       (*oconv)(0, bin2hex(high>> 8));
+       (*oconv)(0, bin2hex(high>> 4));
+       (*oconv)(0, bin2hex(high    ));
+       (*oconv)(0, '\\');
+       (*oconv)(0, 'u');
+       (*oconv)(0, bin2hex(low>>12));
+       (*oconv)(0, bin2hex(low>> 8));
+       (*oconv)(0, bin2hex(low>> 4));
+       (*oconv)(0, bin2hex(low    ));
     }else{
        (*oconv)(0, 'u');
+       (*oconv)(0, bin2hex(c>>12));
+       (*oconv)(0, bin2hex(c>> 8));
+       (*oconv)(0, bin2hex(c>> 4));
+       (*oconv)(0, bin2hex(c    ));
     }
-    (*oconv)(0, bin2hex(c>>12));
-    (*oconv)(0, bin2hex(c>> 8));
-    (*oconv)(0, bin2hex(c>> 4));
-    (*oconv)(0, bin2hex(c    ));
     return;
 }