【问题标题】:Parse XML with special characters (UTF-8)使用特殊字符 (UTF-8) 解析 XML
【发布时间】:2011-01-21 22:11:43
【问题描述】:

我从一些看起来像这样(简化)的 XML 开始:

<?xml version="1.0" encoding="UTF-8"?>
<alldata>
   <data name="Forsetì" />
</alldata>
</xml>

但是在我用simplexml_load_string 解析它之后,特殊字符(i)变成:ì,这显然是很混乱的。

有没有办法防止这种情况发生?

我知道 XML 很好,当保存为 .txt 并在浏览器中查看时,字符很好。当我在 XML 上使用 simplexml_load_string 然后将值保存为文本文件或保存到数据库时,它被破坏了。

【问题讨论】:

  • 你确定显示页面的编码正确吗?

标签: php xml encoding utf-8


【解决方案1】:

看起来 SimpleXML 正在创建一个 UTF-8 字符串,然后以 ISO-8859-1 (latin-1) 或类似 CP-1252 的格式呈现。

当您将结果保存到文件并通过网络服务器提供该文件时,浏览器将使用文件中声明的编码。

包含在网页中
由于您的网页编码不是 UTF-8,因此您需要将字符串转换为您使用的任何编码,例如 ISO-8859-1 (latin-1)。

这很容易用 iconv() 完成:

    $xmlout = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $xmlout);

保存到数据库
您的数据库列未使用 UTF-8 排序规则,因此您应该使用 iconv 将字符串转换为您的数据库使用的字符集。

假设您的数据库排序规则与您呈现的编码相同,则从数据库读取时您无需执行任何操作。

说明
在 UTF-8 中,0xc2 前缀字节用于访问“Latin-1 Supplement”块的上半部分,其中包括重音字母、货币符号、分数、上标 2 和 3、版权和注册商标符号等字符,和不间断的空间。

但是在 ISO-8859-1 中,字节 0xC2 表示一个 Â。因此,当您的 UTF-8 字符串被误解为其中之一时,您会得到 Â 后跟其他一些无意义的字符。

【讨论】:

    【解决方案2】:

    XML 很可能是正常的,但是在存储或输出时字符会损坏。

    如果您在 HTML 页面上输出数据:确保它也以 UTF-8 编码。如果您的 HTML 页面采用 ISO-8859-1,您可以使用utf8_decode 作为快速修复;从长远来看,使用 UTF-8 是更好的选择。

    如果您将数据存储在 mySQL 中,则需要一直选择 UTF8 作为编码:作为连接的编码,在表中以及在您插入数据的列中。

    【讨论】:

    • 我知道 XML 很好,当保存为 .txt 并在浏览器中查看时,字符很好。当我在 XML 上使用 simplexml_load_string 然后将值保存为文本文件或数据库时,它会被破坏。
    【解决方案3】:

    我也遇到了一些问题,它来自 PHP 脚本编码。确保它设置为 UTF-8。 如果仍然不好,请尝试使用 uft8_encode 或 utf8_decode 打印变量。

    【讨论】:

      【解决方案4】:

      XML 在实体方面是严格的,例如 & 应该是 &amp;amp;amp; 和ì 应该是 &amp;amp;igrave;

      所以你需要一个翻译表。

      function xml_entity_decode($_string) {
          // Set up XML translation table
          $_xml=array();
          $_xl8=get_html_translation_table(HTML_ENTITIES,ENT_COMPAT);
          while (list($_key,)=each($_xl8))
              $_xml['&#'.ord($_key).';']=$_key;
          return strtr($_string,$_xml);
      }
      

      【讨论】:

      • 在 XML 中需要替换为实体的唯一字符是基本的五个标记字符:& 符号、撇号、引号和尖括号。如果文档的编码不支持其他代码,则可能需要替换它们,但这不是 UTF-8 的问题。
      【解决方案5】:

      派对迟到了......但我已经遇到了这个问题并解决了如下问题。

      您已在 XML 中声明编码,因此如果您使用 DOMDocument 加载 xml 文件,则不会导致任何问题。

      但如果它发生在其他用例中,您可以使用html_entity_decode,如下所示:

      html_entity_decode($xml->saveXML());
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-01-15
        • 1970-01-01
        • 2020-09-20
        相关资源
        最近更新 更多