Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 使用特殊字符解析XML(UTF-8)_Php_Xml_Encoding_Utf 8 - Fatal编程技术网

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

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编码的。

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


但是在我用
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());