2011-01-28 79 views
2

我已经环顾四周,似乎并不能就这么在这里它找到一个解决方案。返回PHP的SimpleXML值有地方连字符的字符怪异和撇号

我有以下代码:

$file = "adhddrugs.xml"; 
$xmlstr = simplexml_load_file($file); 
echo $xmlstr->report_description; 

这是一个简单的版本,但即使这个尝试任何连字符[R撇号变成:^一(欧元符号)商标标志。

事情我已经试过有:

echo = (string)$xmlstr->report_description; /* did not work */ 
echo = addslashes($xmlstr->report_description); /* yes I know this doesnt work with hyphens, was mainly trying to see if I could escape the apostrophes */ 
echo = addslashes((string)$xmlstr->report_description); /* did not work */ 

也htmlspecial(我又知道不带连字符的工作),ヶ辆,以及其他一些技巧。

现在的情况是,我从进料得到XML文件,所以我不能改变他们,但他们都非常标准。带有连字符等的文本被封装在cdata标签中,并且编码是UTF-8。如果我查看源代码,我会在源代码中显示连字符和撇号。

现在只是为了看看编码是关闭或贴错标签或别的东西,奇怪,我试图查看原始XML文件果然是正确显示。

我相信,在我急于找到我忽略了一些简单的答案,事实上,这确实是我曾经用过的SimpleXML第一次我错过了一个非常简单的解决方案。只是不要停靠我,我真的尝试自己找到答案。

再次感谢。

+0

感谢这些人都看起来不错,直到现在我没有看到反应,我回家了,我会再次检查那些谢天谢地,我会让你知道 – BrandonS 2011-01-28 23:43:44

+0

如果你正在寻找解决方案,而马特的答案是正确的,请阅读Jasso和Takeshin的回答,因为他们三人帮助解决问题1.解释原因2.解释如何解决它3.帮助设置simpleXML中的帮助解决问题O操作。使用其中的一个可能会解决这个问题,但是查看所有答案将确保它解决问题并帮助您理解问题,以便您不会再犯这个错误。谢谢。 – BrandonS 2011-01-31 14:37:18

回答

2

你知道文档的字符集吗?

如果您尚未打印任何内容,您可以在打印任何内容之前执行header('Content-Type: text/html; charset=utf-8');

+0

完美效果很棒!谢谢,我不知道为什么我现在没有尝试过。我想我认为这个问题比一个简单的标题标签问题要大。再次感谢。 – BrandonS 2011-01-31 14:27:54

2

确保您已设置了SimpleXML来使用UTF-8。

确保所有实体使用16进制,而不是HTML实体编码。

也说不定:

$string = html_entity_decode($string, ENT_QUOTES, "utf-8"); 

会有所帮助。

+0

谢谢,我确信SimpleXML使用的是UTF-8,而理论上的代码示例应该与使用头文件相同,但它似乎不起作用。部分答案与Matt和Jasso一起解决了问题。那谢谢啦。 – BrandonS 2011-01-31 14:31:52

4

这是一个简单的版本,但即使 尝试这种任何连字符撇号 都变成:^一(欧元符号) 商标标志。

这是由不正确的字符集猜测(和可能的重新编码)造成的。

如果文本包含“卷曲撇号”=“右单引号”= U + 2019个字符,则将其保存为UTF-8编码结果的字节数为0xE2 0x80 0x99。如果相同的文件然后再次被读取假设它的字符集是windows-1252,则撇号字符(0xE2 0x80 0x99)的字节流被解释为字符’(=具有旋绕,欧元符号,商标符号的小“a”)。再次,如果这个不正确解释的文本保存为UTF-8,原始字符将导致字节流0xC3 0xA2 0xE2 0x82 0xAC 0xE2 0x84 0xA2

摘要:您的原始数据是UTF-8,并且您的代码的一部分读取数据时假定它是windows-1252(或ISO-8859-1,通常实际上被视为windows-1252)。这个字符集假设的一个可能的原因是HTTP的默认字符集是ISO-8859-1。 '当发件人未提供明确的字符集参数时,“文本”类型的媒体子类型定义为在通过HTTP接收时具有默认字符集值“ISO-8859-1”。来源:RFC 2616, Hypertext Transfer Protocol -- HTTP/1.1

PS。这是一个非常普遍的问题。只要进行Google搜索或Bing搜索,查询doesn’t -doesn't,您就会看到许多页面具有相同的编码错误。

0

这是在页面的<head>部分声明不正确字符集的症状(或者不声明和使用缺省字符集(不带重音符号和特殊字符))。

这对拉丁语言有诀窍。

<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 

总新手,对于浏览器的HTML页面有一个基本的布局,用头或报头用来告诉浏览器对页面的一些基本的东西,以及预载了一些脚本,该页面将使用实现其功能。

<html> 
<head> 
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> 
</head> 
<body> 
    Hello world 
</body> 
</html> 

如果省略<head>部分,HTML将使用默认设置(需要一些东西是理所当然的 - 就像使用northamerican字符集,这还不包括许多重音字母,界河显示为“怪异字符”