从 HTML 个实体转换为 UTF-8
Converting from HTML entities to UTF-8
我在将一些编码字符串转换为 utf-8 时遇到问题。
我有一个字符串列表,根据文档,这些字符串是使用数字 HTML 实体编码的 Unicode 字符串。其中一些是:
$str = 'WÖGER'; // seems to be WÖGER
$str = 'Jürgen'; // seems to be Jürgen
$str = 'POßNITZ'; // seems to be POßNITZ
$str = 'SCHLÄGER'; // seems to be SCHLÄGER
我想解码它们并转换为 utf-8。
我都试过了mb_convert_encoding() with HTML-ENTITIES
param as well as html_entity_decode()。我最好的结果出乎意料地是:
html_entity_decode($str, ENT_COMPAT | ENT_HTML401, 'ISO-8859-1');
并且那里的解码 Jürgen
successfully. However I have no luck decoding other strings from this list. I looked ISO-8859-1 编码 table 和 HTML 变音符号代码与我列表中的不同。
我的问题是:我是不是遗漏了一些明显的解码步骤,或者源字符串有问题?
更新(2016-06-27):原来的字符串确实编码错误。这些字符串是在 Latin-1 上下文中读取 UTF-8 值,然后将单个 1 字节字符编码为十六进制实体的结果,因此德语变音符号 ü
变为 ü
并被编码为 2 个单独的字符。接受的答案成功地将它们直接解码为 UTF-8。
我的理解是,虽然我可能错了,但 unicode 字符应该由它们的代码点表示,而不是通过编码单个 UTF-8 字节来表示,这就是你所拥有的。因此,使用 Ö
或命名形式 Ö
.
可以更好地表示 Ö
html_entity_decode
的 ENT_XML1
标志似乎确实使这项工作有效,但我不完全确定它在幕后做了什么。如果你想要更明确的东西:
preg_replace_callback('/&#x([A-Fa-f0-9]{2});/', function ($m) {
return chr(hexdec($m[1]));
}, $str);
我在将一些编码字符串转换为 utf-8 时遇到问题。
我有一个字符串列表,根据文档,这些字符串是使用数字 HTML 实体编码的 Unicode 字符串。其中一些是:
$str = 'WÖGER'; // seems to be WÖGER
$str = 'Jürgen'; // seems to be Jürgen
$str = 'POßNITZ'; // seems to be POßNITZ
$str = 'SCHLÄGER'; // seems to be SCHLÄGER
我想解码它们并转换为 utf-8。
我都试过了mb_convert_encoding() with HTML-ENTITIES
param as well as html_entity_decode()。我最好的结果出乎意料地是:
html_entity_decode($str, ENT_COMPAT | ENT_HTML401, 'ISO-8859-1');
并且那里的解码 Jürgen
successfully. However I have no luck decoding other strings from this list. I looked ISO-8859-1 编码 table 和 HTML 变音符号代码与我列表中的不同。
我的问题是:我是不是遗漏了一些明显的解码步骤,或者源字符串有问题?
更新(2016-06-27):原来的字符串确实编码错误。这些字符串是在 Latin-1 上下文中读取 UTF-8 值,然后将单个 1 字节字符编码为十六进制实体的结果,因此德语变音符号 ü
变为 ü
并被编码为 2 个单独的字符。接受的答案成功地将它们直接解码为 UTF-8。
我的理解是,虽然我可能错了,但 unicode 字符应该由它们的代码点表示,而不是通过编码单个 UTF-8 字节来表示,这就是你所拥有的。因此,使用 Ö
或命名形式 Ö
.
Ö
html_entity_decode
的 ENT_XML1
标志似乎确实使这项工作有效,但我不完全确定它在幕后做了什么。如果你想要更明确的东西:
preg_replace_callback('/&#x([A-Fa-f0-9]{2});/', function ($m) {
return chr(hexdec($m[1]));
}, $str);