php网页抓取乱码(PHPwebService服务器本地语言的Get方法获取参数时获取到的参数)
优采云 发布时间: 2022-03-09 12:16php网页抓取乱码(PHPwebService服务器本地语言的Get方法获取参数时获取到的参数)
最近在做PHP webService服务器,发现使用Get方法获取参数时获取的参数是乱码。经过一番折腾,发现浏览器本地语言的问题。首先,我们来看一下简单的测试代码:
header("内容类型:text/html;charset=UTF-8");
$name=['name'];
var_dump($name);
测试结果如下:
代码声明响应内容的编码为utf-8,显示的内容确实是乱码。这里请注意var_dump输出的变量长度只有4。显然,utf-8编码下两个汉字的长度必须大于4字节,接下来我们看一下火狐访问这个的url页
FireFox会自动对中文url进行编码,所以我们可以看到测试变成了%B2%E2%CA%D4。显然,这里的一个词是两个字节,是 gb2313、gbk 等中文编码格式,而不是 utf-8 编码。如果我们将页面的编码切换为gbk,中文参数会正常显示,见下图
接下来我们再做一个测试,代码如下:
header("内容类型:text/html;charset=UTF-8");
$name=['name'];
var_dump($name);
测试结果,正常显示:
那么,是什么导致了这个问题呢?
答案是浏览器的默认编码有问题。我们都使用中文系统,浏览器的默认编码自然会设置为本地化。比如我自己电脑上IE和FireFox的默认编码都是gb系列。
当浏览器请求用户输入的url时,会以默认编码格式而不是页面默认编码格式发送url中的中文,这就是为什么页面中带有中文的链接是正常的,链接我们手动输入
乱码的原因。同样,如果我们将浏览器的默认编码调整为utf-8,那么输入url中的中文就会按照utf-8进行编码。
除上述情况外,还会在以下情况下发生这种情况:
如果gbk编码页面生成的地址链接到utf-8页面,gbk页面的中文以gbk格式编码传输到下一页,那么utf-8后面肯定会出现乱码收到编码。
IIS的url重写模块,重写的中文编码也是gbk,如果你的页面是utf-8编码,那么重写参数会失效。在这些情况下,我们需要使用php内置的转码功能来处理编码问题:
计划一:
$name"gbk","utf-8",$name);
场景二:
$name,"utf-8","gbk");
PS:实测IE浏览器默认GET编码方式采用占用空间最小的方式,即使用GBK码,在php页面中加入这个转换功能即可正常使用。Firefox 和 Chrom 默认为 UTF-8,没有此转换功能。