Php 使用特殊字符解析XML(UTF-8)
我从一些XML开始,看起来像这样(简化):Php 使用特殊字符解析XML(UTF-8),php,xml,encoding,utf-8,Php,Xml,Encoding,Utf 8,我从一些XML开始,看起来像这样(简化): 但是在我用simplexml\u load\u string解析它之后,特殊字符(I)变成了:I、,这显然是非常混乱的 有没有办法防止这种情况发生 事实上,我知道XML很好,当保存为.txt并在浏览器中查看时,字符很好。当我在XML上使用simplexml\u load\u字符串,然后将值保存为文本文件,或保存到数据库时,它被损坏了。很可能XML没有问题,但在存储或输出时字符会被损坏 如果您在HTML页面上输出数据:请确保它也是用UTF-8编码的。
但是在我用simplexml\u load\u string
解析它之后,特殊字符(I)变成了:I、
,这显然是非常混乱的
有没有办法防止这种情况发生
事实上,我知道XML很好,当保存为.txt并在浏览器中查看时,字符很好。当我在XML上使用simplexml\u load\u字符串,然后将值保存为文本文件,或保存到数据库时,它被损坏了。很可能XML没有问题,但在存储或输出时字符会被损坏 如果您在HTML页面上输出数据:请确保它也是用UTF-8编码的。如果您的HTML页面在ISO-8859-1中,您可以使用
utf8\u decode
作为快速修复;从长远来看,使用UTF-8是更好的选择
如果要将数据存储在mySQL中,则需要始终选择UTF8作为编码:作为连接的编码,在表中以及插入数据的列中 我在这方面也遇到了一些问题,它来自PHP脚本编码。确保设置为UTF-8。
如果仍然不好,请尝试使用uft8_encode或utf8_decode打印变量。XML对于实体来说是严格的,比如&should&code>&;amp代码>和ì应
&;伊格雷夫代码>
所以你需要一个翻译表
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);
}
这看起来SimpleXML正在创建一个UTF-8字符串,然后以ISO-8859-1(拉丁语-1)或类似CP-1252的格式呈现
将结果保存到文件并通过web服务器提供该文件时,浏览器将使用文件中声明的编码
包括在网页中
由于您的网页编码不是UTF-8,因此需要将字符串转换为您正在使用的任何编码,例如ISO-8859-1(拉丁语-1)
这可以通过iconv()轻松完成:
保存到数据库
数据库列未使用UTF-8排序规则,因此应使用iconv
将字符串转换为数据库使用的字符集
假设您的数据库排序规则与您在中呈现的编码相同,则从数据库中读取时无需执行任何操作
解释
在UTF-8中,0xc2前缀字节用于访问“Latin-1增补”块的上半部分,该块包括重音字母、货币符号、分数、上标2和3、版权和注册商标符号以及非中断空格等字符
然而,在ISO-8859-1中,字节0xC2表示一个。因此,当您的UTF-8字符串被误解为这些字符串之一时,后面会跟着一些其他无意义的字符。晚会迟到了。。。但我已经面对了这一点,并解决了如下问题
您已经在XML中声明了编码,所以如果您使用它加载XML文件,将不会引起任何问题
但如果它发生在其他用例中,您可以使用html\u entity\u decode
如下所示:
html_entity_decode($xml->saveXML());
您确定显示页面上的编码正确吗?我知道事实上,XML很好,当保存为.txt并在浏览器中查看时,字符很好。当我在XML上使用simplexml\u load\u字符串,然后将值另存为文本文件或数据库时,它会被破坏。在XML中需要替换为实体的唯一字符是基本的五个标记字符:符号和、撇号、引号和尖括号。如果文档的编码不支持其他编码,则可能需要替换其他编码,但UTF-8不存在这一问题。
$xmlout = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $xmlout);
html_entity_decode($xml->saveXML());