Fixed bug #41067 (json_encode() problem with UTF-16 input).

This commit is contained in:
Ilia Alshanetsky 2007-04-16 22:31:05 +00:00
parent 8f845b705b
commit 8b245e5aaf
3 changed files with 45 additions and 0 deletions

3
NEWS
View File

@ -1,10 +1,13 @@
PHP NEWS
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
?? Apr 2007, PHP 5.2.2RC2
- Fixed bug #41093 (magic_quotes_gpc ignores first arrays keys). (Arpad, Ilia)
- Fixed bug #41083 (mysql_ping() requires MYSQL_OPT_RECONNECT to be set since
MySQL 5.0.13). (xiaojb at gmail dot com, Tony)
- Fixed bug #41075 (memleak when creating default object caused exception).
(Dmitry)
- Fixed bug #41067 (json_encode() problem with UTF-16 input). (jp at df5ea
dot net. Ilia)
- Fixed bug #41063 (chdir doesn't like root paths). (Dmitry)
- Fixed bug #41061 ("visibility error" in ReflectionFunction::export()).
(Johannes)

View 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));

View File

@ -0,0 +1,23 @@
--TEST--
Bug #41067 (json_encode() problem with UTF-16 input)
--SKIPIF--
<?php if (!extension_loaded("json")) print "skip"; ?>
--FILE--
<?php
$single_barline = "\360\235\204\200";
$array = array($single_barline);
print bin2hex($single_barline) . "\n";
// print $single_barline . "\n\n";
$json = json_encode($array);
print $json . "\n\n";
$json_decoded = json_decode($json, true);
// print $json_decoded[0] . "\n";
print bin2hex($json_decoded[0]) . "\n";
print "END\n";
?>
--EXPECT--
f09d8480
["\ud834\udd00"]
f09d8480
END