获取网页然后发布内容时的php文本编码

时间:2013-03-29 23:13:31

标签: php http character-encoding libcurl

我正在尝试获取网页解析其中的一部分,然后将其作为值发布。问题是:当有一个字符为ó时,我会检索³,因此在发布时,urlencode转换会将这些字符转换为完全不同的字符,但这不起作用。

更准确地说,当utf-8中的ó被解释为ISO-9959-1时,或者至少是我的浏览器所做的,如果我设置在utf-8中查看页面然后我请参阅ó,如果我将浏览器设置为在ISO-9959-1中查看页面,那么我看到³,其他编码会产生不同的符号。

我试图将页面的结果以及特定的字符串转换为utf-8,我也尝试将标题设置为仅接受utf-8,但这也不起作用。我很确定这是问题,但我的想法已经不多了。我改变了php.ini中的配置,但也许我还没有重启,基本上这就像在黑暗中拍摄,一些帮助将非常感激。

如果这有帮助:具体代码在此处:https://github.com/trylks/golem/blob/master/php/copperGolem.php

当使用GET从以前获得的页面获取其中一个参数值时,该方法为“form”。

谢谢。

PD解决了:过去几个小时我一直在研究这个问题,我不知道是否我改变了许多其他必要的东西。在任何情况下,使其工作的最后一个改变是将第60行更改为:$dom->loadHTML(mb_convert_encoding($p, 'html-entities', mb_detect_encoding($p)));这样做了。问题不是libcurl,而是DomDocument,如下所述:PHP DomDocument failing to handle utf-8 characters (☆)

1 个答案:

答案 0 :(得分:0)

问题出在DomDocument,它没有正确处理utf-8。转换为html-entities是最安全的选项,当使用echo(甚至使用cli)或urlencoding这些字符输出这些字符时,它就像魔术一样。基本上DomDocument不接受utf-8但它输出utf-8,或者看起来如此。因此,必须进行奇怪的转换,以便DomDocument撤消它,一切都恢复正常。

要做到这一点,并且$dom是一个DomDocument,只要每次调用$dom->loadHTML($p)都这样做就足够了:

$dom->loadHTML(mb_convert_encoding($p, 'html-entities', mb_detect_encoding($p)));

在另一个问题中更好地解释了这一点:PHP DomDocument failing to handle utf-8 characters (☆)