繁体   English   中英

使用 PHP 解码 unicode charmap(很可能是非标准的)

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM