]> granicus.if.org Git - php/commitdiff
MFB: Fixed bug #41067 (json_encode() problem with UTF-16 input).
authorIlia Alshanetsky <iliaa@php.net>
Thu, 19 Apr 2007 22:49:11 +0000 (22:49 +0000)
committerIlia Alshanetsky <iliaa@php.net>
Thu, 19 Apr 2007 22:49:11 +0000 (22:49 +0000)
ext/json/JSON_parser.c

index 4b88b9fbd526b618e094bbc1e36cc6599d47878f..fdd861152be65f26313b051d510b0c789d0070b0 100644 (file)
@@ -316,6 +316,25 @@ static void utf16_to_utf8(smart_str *buf, unsigned short utf16)
         smart_str_appendc(buf, 0xc0 | (utf16 >> 6));
         smart_str_appendc(buf, 0x80 | (utf16 & 0x3f));
     }
+    else if ((utf16 & 0xfc00) == 0xdc00
+                && buf->len >= 3
+                && ((unsigned char) buf->c[buf->len - 3]) == 0xed
+                && ((unsigned char) buf->c[buf->len - 2] & 0xf0) == 0xa0
+                && ((unsigned char) buf->c[buf->len - 1] & 0xc0) == 0x80)
+    {
+        /* found surrogate pair */
+        unsigned long utf32;
+
+        utf32 = (((buf->c[buf->len - 2] & 0xf) << 16)
+                    | ((buf->c[buf->len - 1] & 0x3f) << 10)
+                    | (utf16 & 0x3ff)) + 0x10000;
+        buf->len -= 3;
+
+        smart_str_appendc(buf, 0xf0 | (utf32 >> 18));
+        smart_str_appendc(buf, 0x80 | ((utf32 >> 12) & 0x3f));
+        smart_str_appendc(buf, 0x80 | ((utf32 >> 6) & 0x3f));
+        smart_str_appendc(buf, 0x80 | (utf32 & 0x3f));
+    }
     else
     {
         smart_str_appendc(buf, 0xe0 | (utf16 >> 12));