它不是UTF-16 编码。它看起来像是伪造的编码,因为 \uXXXX 编码独立于 Unicode 的任何 UTF 或 UCS 编码。\u00c2\u00a3
真的映射到£
字符串。
您应该拥有的\u00a3
是£
.
{0xC2, 0xA3} 是此代码点的 UTF-8 编码的 2 字节字符。
如果像我认为的那样,将原始 UTF-8 字符串编码为 JSON 的软件没有注意到它是 UTF-8 并将每个字节盲目编码为转义的 unicode 代码点,那么您需要转换每对 unicode 代码指向一个 UTF-8 编码的字符,然后将其解码为原生 PHP 编码以使其可打印。
function fixBadUnicode($str) {
return utf8_decode(preg_replace("/\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})/e", 'chr(hexdec("$1")).chr(hexdec("$2"))', $str));
}
这里的例子:http: //phpfiddle.org/main/code/6sq-rkn
编辑:
如果要修复字符串以获得有效的 JSON 字符串,则需要使用以下函数:
function fixBadUnicodeForJson($str) {
$str = preg_replace("/\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})/e", 'chr(hexdec("$1")).chr(hexdec("$2")).chr(hexdec("$3")).chr(hexdec("$4"))', $str);
$str = preg_replace("/\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})/e", 'chr(hexdec("$1")).chr(hexdec("$2")).chr(hexdec("$3"))', $str);
$str = preg_replace("/\\\\u00([0-9a-f]{2})\\\\u00([0-9a-f]{2})/e", 'chr(hexdec("$1")).chr(hexdec("$2"))', $str);
$str = preg_replace("/\\\\u00([0-9a-f]{2})/e", 'chr(hexdec("$1"))', $str);
return $str;
}
编辑 2:修复了以前的函数,将任何错误的 unicode 转义 utf-8 字节序列转换为等效的 utf-8 字符。
请注意,其中一些可能来自 Word 等编辑器的字符无法翻译为 ISO-8859-1,因此将显示为“?” ut8_decode 之后。