php网页抓取乱码(PHP接收get中文参数乱码的解决办法:中文标签乱码)

优采云 发布时间: 2022-02-19 19:17

  php网页抓取乱码(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 :)

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线