From: Ilia Alshanetsky Date: Thu, 19 Apr 2007 22:49:11 +0000 (+0000) Subject: MFB: Fixed bug #41067 (json_encode() problem with UTF-16 input). X-Git-Tag: RELEASE_1_2_0~267 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=68a31e78d33e501b41502bf73e708f1cdf5fcb79;p=php MFB: Fixed bug #41067 (json_encode() problem with UTF-16 input). --- diff --git a/ext/json/JSON_parser.c b/ext/json/JSON_parser.c index 4b88b9fbd5..fdd861152b 100644 --- a/ext/json/JSON_parser.c +++ b/ext/json/JSON_parser.c @@ -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));