[英]Decode unicode charmap (most likely non-standard) with PHP
我有这个:
\u00c3\u0083\u00c2\u00b6
那代表德语ö
字符( ö
在 html 中)。
我的问题是我不知道它是什么编码,我尝试了几种解码方法(包括 json_decode 和mb_convert_encode('\Ã\\Â\¶','HTML-ENTITIES','UTF-8');
) 到ö
字符,但没有一个工作。
我无法首先查找它是如何编码的,因为它来自源代码不可用的数据库转储。
这个问题不是如何将 Unicode 转义序列(如“\í”)解码为正确的 UTF-8 编码字符?
由于 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 贯穿始终
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.