Php 从HTML实体转换为UTF-8

Php 从HTML实体转换为UTF-8,php,unicode,encoding,utf-8,iso-8859-1,Php,Unicode,Encoding,Utf 8,Iso 8859 1,我在将一些编码字符串转换为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 $

我在将一些编码字符串转换为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

我用
HTML-ENTITIES
param和。我的最佳结果出人意料地是:

html_entity_decode($str, ENT_COMPAT | ENT_HTML401, 'ISO-8859-1');
而那被解码了的
Jürgen
。但是,我没有运气解码这个列表中的其他字符串。我查看了UMLAUT的编码表和HTML代码,它们与我列表中的不同

我的问题是:我是否遗漏了一些明显的解码步骤,或者源字符串是否有问题


更新(2016-06-27):原始字符串的编码确实不正确。这些字符串是在拉丁语-1上下文中读取UTF-8值,然后将单个1字节字符编码为十六进制实体的结果,因此德语umlaut
u
变成了
ü
,并被编码为两个单独的字符。被接受的答案成功地将它们直接解码为UTF-8。

我的理解是,尽管我可能错了,unicode字符应该由它们的代码点来表示,而不是通过编码单个UTF-8字节来表示,这正是您所拥有的。因此,
Ö和#xD6
或以命名形式,
Ö

ENT\u XML1
标志到
html\u entity\u decode
似乎确实起到了作用,尽管我不完全确定它在引擎盖下的作用。如果您想要更明确的内容:

preg_replace_callback('/&#x([A-Fa-f0-9]{2});/', function ($m) {
    return chr(hexdec($m[1]));
}, $str);

我以为你想要UTF-8字符串,而不是ISO-8859。为什么要解码到ISO-8859?字符串真正来自哪里?看起来您读取了一个文件,然后将内容编码为HTML实体@nj在“unicode字符应该由其代码点表示,而不是通过编码单个UTF-8字节”这一点上是正确的,但我担心他试图用自己的方式修复它是错误的。@deceze我确实想要UTF-8,这就是为什么我说得到一个有效的UTF-8结果是出乎意料的(eval.in页面是UTF-8)使用不同的编码,甚至更意外地将其更改为UTF-8会返回错误的符号:。@JosefZ它们来自第三方web服务,该服务使用此编码方案(数字HTML实体)将它们放入HTTP请求头中。其思想是HTTP头不能保存Unicode字符,因此必须以某种方式对其进行编码,这就是所选择的方案。虽然
ENT\u XML1
标志似乎有效,但OP的编码非常糟糕,显式
preg\u replace
可能是唯一真正的解决方法。这两种解决方案都有效。谢谢同意,现在检查这是否是编码错误process@deceze我同意这一点。我目前也在检查这是否是源字符串中的错误。虽然这个解决方案在这里有效,但顺便说一下。@deceze我更新了解释字符串起源的帖子。关于编码错误,你是对的。