使用特殊字符解析XML(UTF-8)

时间:2010-02-28 01:28:11

标签: php xml encoding utf-8

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

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

但是在我用simplexml_load_string解析它后,特殊字符(i)变为:ì,显然很糟糕。

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

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

5 个答案:

答案 0 :(得分:6)

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

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

包含在网页中
由于您的网页编码不是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字符串被误解为其中之一时,你会得到一些其他无意义的字符。

答案 1 :(得分:0)

XML很可能很好,但是在存储或输出时字符会被破坏。

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

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

对于实体来说,XML是严格的,比如&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);
}

答案 4 :(得分:0)

聚会晚了......但我已经面对这个问题,并在下面解决了。

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

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

html_entity_decode($xml->saveXML());