我有这个:
\u00c3\u0083\u00c2\u00b6
这代表德国ö
角色(html中的ö
)。
我的问题是我不知道它是什么编码,我尝试了几种解码方法(包括json_decode和mb_convert_encode('\u00c3\u0083\u00c2\u00b6','HTML-ENTITIES','UTF-8');
)来获取ö
字符,但没有一个工作。
由于事实上这是源于源代码不可用的数据库转储,所以我无法查找它是如何编码的。
这个问题不是How to decode Unicode escape sequences like "\u00ed" to proper UTF-8 encoded characters?的重复
由于charmap似乎不是任何有效的UTF-8或UTF-16,因此无法使用链接问题中的任何方法进行解码。
因此,作为参考,您的源数据是UTF8,然后有人运行了相当于utf8_encode()
的东西[将ISO8859-1转换为UTF8,而不考虑输入实际上是什么]两次。
function unescape_unicode($input) {
return preg_replace_callback(
'/\\\\u([0-9a-fA-F]{4})/',
function ($match) {
return mb_convert_encoding(
pack('H*', $match[1]),
'UTF-8',
'UTF-16BE'
);
},
$input
);
}
$input = "\u00c3\u0083\u00c2\u00b6";
var_dump(
bin2hex(
utf8_decode( // un-mojibake #1
utf8_decode( // un-mojibake #2
unescape_unicode($input)
)
)
)
);
输出:
string(4) "c3b6"
其中0xc3 0xb6
是ö
的UTF8表示。
不要将此代码投入生产。您应该只使用它来解除无法以其他方式从底层存储中正确恢复或检索的数据。上述代码的主要目的是说明它是如何被破坏的。
这是你的新圣经:UTF-8 all the way through