php网页抓取乱码(PHP接收get中文参数乱码的解决办法:中文标签乱码)
优采云 发布时间: 2022-02-19 19:17php网页抓取乱码(PHP接收get中文参数乱码的解决办法:中文标签乱码)
php获取get参数乱码的解决方法:1、通过"$str=iconv("gb2312", "utf-8", $str);"处理编码;2、 通过 "mb_convert_encoding($str,"utf-8", "gb2312");" 方法。
本文运行环境:Windows7系统,PHP7.1、Dell G3电脑。
PHP接收GET中文参数乱码的深入研究
相信很多PHPer都会遇到这样的问题:在utf-8页面下,如果直接访问带有test.php?s=test等中文参数的地址,输出参数的值会出现乱码,可以在搜索引擎上查询 看了相关资料后,只给出了一些解决方案,但没有人研究过这个问题的原因。今天,我将通过这篇文章来深入探讨这个问题的原因:
首先我们演示一下这个问题,测试代码和运行结果如下。
代码:
测试结果:
代码声明响应内容的编码为utf-8,显示的内容确实是乱码。
这里请注意,var_dump输出的变量长度只有4。显然,在utf-8编码下,两个汉字的长度必须大于4字节。
那么我们来看看火狐对这个页面url的访问
FireFox会自动对中文url进行编码,所以我们可以看到测试变成了%B2%E2%CA%D4。显然,这里的一个词是两个字节,是 gb2313、gbk 等中文编码格式,而不是 utf-8 编码。(推荐:《PHP 视频教程》)
如果我们将页面的编码切换为gbk,中文参数会正常显示,见下图
这时候就诞生了一个有趣的问题:为什么emlog的中文标签等参数没有乱码?
经过多次测试,我发现了一个小区别:
页面生成emlog中文参数的链接,上面测试直接在地址栏手动输入,
如果我们直接输入原创等链接,程序也会提示找不到标签
测试代码如下:
测试结果,正常显示:
请注意上图中红框内标注的url编码。这次测试中的两个字由6个字节组成,而不是之前的2个字节,所以说明中文参数已经被正确编码为utf-8。
那么,是什么导致了这个问题呢?
答案是浏览器的默认编码有问题。我们都使用中文系统。浏览器的默认编码也将设置为本地化。比如我电脑上IE的FireFox默认编码是gb系列,请参考下图:
IE的默认设置:
Firefox 的默认设置:
因为这个设置,浏览器在请求用户输入的url时,会以默认编码格式而不是页面默认编码格式发送url中的中文,这就是为什么页面中带有中文的链接是正常的,我们手动输入的链接是乱码的原因。同样,如果我们将浏览器的默认编码调整为utf-8,那么输入url中的中文就会按照utf-8进行编码。
除上述情况外,还会在以下情况下发生这种情况:
如果gbk编码页面生成的地址链接到utf-8页面,gbk页面的中文以gbk格式编码传输到下一页,那么utf-8后面肯定会出现乱码收到编码。
IIS的url重写模块,重写的中文编码也是gbk,如果你的页面是utf-8编码,那么重写参数会失效。
在这些情况下,我们需要使用php内置的转码功能来处理编码问题:
计划一:
$str =iconv("gb2312","utf-8",$str);
场景二:
mb_convert_encoding($str,"utf-8", "gb2312");
希望这篇文章能帮助那些在编码问题上摸不着头脑的 PHPer :)