当前位置: 首页 > 后端技术 > PHP

php接收GET方法传入的乱码中文参数

时间:2023-03-29 20:26:39 PHP

最近写了一个简单的页面,从浏览器(test.php?name=test)传入中文参数,不管怎么设置utf-8页面都显示乱码,后来找了很多解决方法谷歌,但问题的原因是什么?没有人深入研究过这个问题。出于好奇,你得找出是什么原因造成的,也算是积累经验吧!先看简单的测试代码:测试结果如下:代码声明响应内容的编码为utf-8,显示的内容确实是乱码。这里要注意var_dump输出的变量长度只有4,显然在utf-8编码下两个汉字的长度必须大于4个字节。然后我们再看看Firefox访问这个页面的url。FireFox会自动转换中文urlEncoding,所以我们可以看到测试变成了%B2%E2%CA%D4。很明显,这里的一个字是两个字节,是gb2313、gbk等中文编码格式,不是utf-8编码。如果我们把页面的编码换成gbk,中文参数就可以正常显示了,见下图再做一次测试,代码如下:测试结果正常显示:So,what造成这个问题?答案是浏览器的默认编码有问题。我们都使用中文系统,浏览器的默认编码自然会设置为本地化。比如我电脑上IE和FireFox的默认编码都是gb系列。当浏览器请求用户输入的url时,会默认以默认编码格式发送url中的中文,而不是默认页面的编码格式。这就是为什么页面中带有汉字的链接是正常的,而我们手动输入的链接会出现乱码的原因。同样,如果我们将浏览器的默认编码调整为utf-8,那么输入url中的中文就会按照utf-8进行编码。除了上述之外,还有以下几种情况会出现这种情况:如果gbk编码页面生成的地址链接到utf-8页面,gbk页面上的中文是用gbk格式编码传输的到下一页,那么utf收到-8码后肯定会出现乱码。IIS的url改写模块,改写后的中文编码也是gbk,如果你的页面是utf-8编码,那么改写参数就会失效。在这些情况下,我们需要使用PHP内置的转码功能来处理编码问题:解决方案一:$name=iconv("gbk","utf-8",$name);方案二:mb_convert_encoding($name,"utf-8","gbk");