使用扩展ASCII解码HTML编码的字符

4

我有一个XML文件,其中包含编码为&#xxx;的特殊字符。只要我将这些字符输出到浏览器中,就可以正常工作,因为它们是HTML编码(某种程度上)。

但是我需要使用simplexml_load_string读取XML文件,这会导致某些字符出现乱码,因为它们在扩展ASCII表中。

例如:

š转换为š-但当我尝试使用html_entity_decode时,我得到一个空字符。

我尝试了几乎所有方法,从iconvmb_decode_numericentity,但都没有成功。

如何将那些&#xxx;转换为真正的字符?

[编辑] 我发现这个表格http://www.ascii-code.com声称š是使用ISO-8859-1的扩展ASCII字符 我很困惑...


根据您的例子,š 应该解码为 š,您没有使用 utf-8 编码而是使用了一些 iso。个人建议切换到 utf-8,但这并不是重点。我猜想您需要指示 html_entity_decode() 保持您喜欢的编码方式,而不是采用 php.ini 中指定的默认编码方式。 - Karel Kubat
谢谢Karel - 我实际上尝试了使用html_entity_decode()支持的每种编码,但是它们都没有起作用 :( - Swissdude
听起来像是非标准和/或可能已过时的HTML实体使用。不确定是否有任何标准的PHP函数可以处理这个问题。也许你需要编写一个自定义的preg_replace_callback函数或类似的函数来解码这些特定的代码点。 - deceze
这绝对不是标准的。XML 是由某个第三方公司提供的。我不知道他们为什么要这样做。有趣的是,当我在 Google 搜索栏中添加 '&#154' 时,它会将其翻译为 š - 所以如果他们能做到,为什么我不能呢?;) - Swissdude
1个回答

1

你似乎在处理两个在打印时几乎相同的不同字符:

我发现我的字体和文本编辑器都无法正确处理第二个字符。因此,你很可能会因为这个原因得到一个空白字符。

第二个字符似乎是某种奇怪的控制字符,其确切目的超出了我的理解范围:

后面跟着一个可打印字符 (0x20 到 0x7E) 或格式控制字符 (0x08 到 0x0D)。目的是提供一种方法,可以定义一个控制函数或图形字符,无论使用哪种图形或控制集都可用。这个字节所引发的定义从未在国际标准中实现。不是 ISO/IEC 6429 的第一版的一部分。

值得注意的是,XML 中的字符引用 使用来自固定编码(某个 UCS 变体)的数字代码。如果 XML 文件的作者不遵循此约定,则将面临无效的 XML(有效地阻止使用 XML 库解析它)或包含损坏数据的有效 XML(最多需要繁琐的后处理)。


谢谢Álvaro。但它应该转换为第一个字符(š),因为它是一个带有该字符的名称的一部分。正如我在我的编辑中提到的,我发现š是Windows-1252 ASCII表的一部分。但即使我尝试使用html_entity_decode('š', ENT_COMPAT, 'Windows-1252'),我也得到了一个空白输出。 - Swissdude
无法选择XML实体的编码方式。不管怎样,不要相信渲染出来的字符;而是使用十六进制编辑器或通过bin2hex()打印数据(如果您没有)。 - Álvaro González

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接