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

  最近作PHP的webService服务器,发现用Get方法获取参数时获取到的参数时乱码。一番折腾后发现时浏览器本地语言的问题。 php

首先先来看下简单的测试代码:
  1. <?php  
  2. header("Content-Type:text/html;charset=UTF-8");  
  3. $name = $_GET['name'];  
  4. var_dump($name);  
  5. ?> 

测试结果以下: html

代码中声明了响应内容的编码为utf-8,显示的内容确实乱码。在这里请注意var_dump出变量的长度只有4 ,很显然,两个中文字的长度在utf-8编码下确定不止4个字节,而后咱们再看一下Firefox的访问这个页面url web

FireFox会自动将中文url编码,因此咱们能够看到测试变成了%B2%E2%CA%D4,很明显,这里一个字是两个字节,是gb231三、gbk等中文编码格式,而不是utf-8编码。若是咱们把页面的编码切换为gbk,中文参数就会显示正常,参见下图 浏览器

接下来咱们作另一个测试,代码以下: 服务器

  1. <?php  
  2. header("Content-Type:text/html;charset=UTF-8");  
  3. $name = $_GET['name'];  
  4. var_dump($name);  
  5. ?>  
  6.  
  7. <form method="GET">  
  8. <input name="name" />  
  9. <input type="submit" value="输入中文提交" />  
  10. </form> 

测试结果,正常显示: 函数

那么,是什么致使这个问题的发生呢?
答案是浏览器默认编码在做怪,咱们都用的是中文系统,浏览器默认的编码天然也会设置为本地化,例如我本身电脑上的IE和FireFox的默认编码都是gb系列的。
浏览器在请求用户输入的url 时会默认把url中的中文以默认的编码格式发送而不是以页面的编码格式发送,这就是为何页面中带有中文的连接正常而咱们手动输入的连接 测试

会乱码的缘由。同理,若是咱们把浏览器的默认编码调整为utf-8,那么输入url中的中文则会按照utf-8编码。 编码

除了上面的以外,还有如下状况会出现这种状况: url

若是gbk编码的页面生成的地址连接到utf-8的页面,gbk页面的中文是按照gbk的格式编码传送给下个页面,那么utf-8编码接收后确定会出现乱码。
IIS的url重写模块,重写后的中文编码也是gbk,若是你的页面是utf-8编码,那么重写参数将会失效。像这些状况,咱们就须要使用php内置的转码函数来处理编码问题了: spa

方案1:

  1. $name = iconv("gbk","utf-8",$name); 

方案2:

  1. mb_convert_encoding($name, "utf-8", "gbk"); 

 

PS:实测IE浏览器默认GET编码方式采用最少空间占用模式,即采用GBK码,php页面添加该转换函数才能正常使用。而Firefox和Chrom默认UTF-8无需该转换函数。

相关文章
相关标签/搜索