php文本编码时,获取一个网页,然后张贴内容


php text encoding when GETting a webpage and then POSTing contents

我试图得到一个网页解析它的一部分,然后POST它作为一个值。问题是:当有一个字符为ó时,我检索ó,因此在发布它时,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

方法是"form",当使用GET从先前获得的页面获取其中一个参数值时。

谢谢。

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

问题是在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无法处理utf-8字符(☆)