【问题标题】:weird chars after getting value from XML php从 XML php 获取价值后的奇怪字符
【发布时间】:2011-05-30 15:10:25
【问题描述】:

我试图从 xml 中获取一个 € 的值,但是当我尝试时它会返回奇怪的代码。

$xmlDate = $searchNode->getElementsByTagName( "kostenvoorverkoop" );
$valueKostenvoorverkoop = htmlentities($xmlDate->item(0)->nodeValue,ENT_QUOTES,"UTF-8");
//gives back Á€10,- instead of €10,-

找不到问题。

//XML
<?xml version="1.0" encoding="ISO-8859-1" ?>
<price>€10</price>

如果我离开 htmlentities,它会给出一个完全奇怪的字符串,例如 ÁáÙ%10

如果有人能帮我解决这个问题,那对我有很大帮助,在此先感谢。

编辑: 找到了一个小解决方法:将€更改为&amp;amp;euro;。知道不干净但有效。

【问题讨论】:

  • ISO-8859-1 与 UTF-8 完全不同...
  • ISO-8859-1 不包含欧元字符。这意味着在 XML 声明中声明的编码不正确,并且您的 XML 在技术上格式不正确。可能您的文档是 ISO-8859-15 或 windows-1252(或 UTF-8 可能包含无效的字节序列)。

标签: php xml special-characters


【解决方案1】:
<?xml version="1.0" encoding="ISO-8859-1" ?>
<price>€10</price>

字符 在 ISO-8859-1 中不存在,所以这个 XML 声明不可能是正确的。

Á€ 的输出表明该文件实际上已在 Windows 代码页 1252(西欧)中编码,该代码页类似于 ISO-8859-1,但在 0x80–0x9F 范围内具有不同的字符,包括欧元符号。

PHP 已将数据解析为 ISO-8859-1,其中 的 CP1252 编码,字节 0x80 映射到控制字符 U+0080。然后它会为您提供包含 U+0080 的 Unicode 字符串作为 UTF-8 编码的字节字符串 U+00C2,U+0080。将其输出到作为 cp1252、ISO-8859-1 的页面中的浏览器(由于繁琐而令人困惑的遗留原因)或在西欧机器上没有字符集,会得到 Á€htmlentities() 不以任何方式对此进行编码,因为控制代码 U+0080 没有 HTML 实体。

以下是您应该如何继续:

  • 如果您的 XML 输入文件必须在 cp1252 中,请在 XML 声明的 encoding="windows-1252" 中声明,而不是在不准确的 ISO-8859-1 中声明。不过,XML 解析器不需要能够读取 cp1252,因此更好的互操作性是只使用默认的 UTF-8 编码并重新保存文件以匹配。

  • 使用Content-Type 标头或元标记以UTF-8 格式提供您的输出HTML 页面。然后使用htmlspecialchars() 而不是htmlentities(),这样您就不会浪费时间对不需要的非ASCII 字符进行编码。

【讨论】:

  • 如果您无法控制输入格式,第三种选择是使用 iconv() 进行预处理。
  • 我将其更改为 encoding="windows-1252",但仍然在 € 符号前显示 Á
  • 通过向 xml 发送 &amp;amp;euro; 找到了一个小解决方法。这将最终成为一个€符号。不干净,但它可以工作
  • 如果可行,您可能会遇到更大的问题:HTML 注入。例如,如果可以使 XML 文件包含 &lt;price&gt;&amp;lt;script&gt;alert()&amp;lt;/script&gt;&lt;/price&gt;,它最终会将活动脚本放入页面中。 htmlspecialchars() 并在 UTF-8 中执行所有操作是当今最好的方法。
【解决方案2】:

您是否尝试将 xml 中的编码从 ISO-8859-1 更改为 UTF-8 ? 或者在进行解码时将这个字符集 ISO-8859-1 放入 php..

【讨论】:

    猜你喜欢
    • 2015-06-20
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-19
    • 1970-01-01
    相关资源
    最近更新 更多