我开始使用一些看起来像这样的XML(简化):
<?xml version="1.0" encoding="UTF-8"?>
<alldata>
<data name="Forsetì" />
</alldata>
</xml>
但是在我用simplexml_load_string
解析它后,特殊字符(i)变为:ì
,显然很糟糕。
有没有办法防止这种情况发生?
我知道XML很好,当保存为.txt并在浏览器中查看时,字符很好。当我在XML上使用simplexml_load_string,然后将值保存为文本文件或数据库时,它会被破坏。
答案 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;
,而{应&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());