最近写了个简单的页面,从浏览器中传入中文参数(test.php?name=测试),不论怎么设置utf-8的页面中都显示乱码,google了一把也查到了不少解决办法,但是问题的原因到底是什么呢?没有人深入研究这个问题。出于好奇便要好好查查到底是什么原因导致,也算涨点经验!
首先先来看下简单的测试代码:

  1. <?php
  2. header("Content-Type:text/html;charset=UTF-8");
  3. $name = $_GET['name'];
  4. var_dump($name);
  5. ?>

测试结果如下:

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

FireFox会自动将中文url编码,所以我们可以看到测试变成了%B2%E2%CA%D4,很明显,这里一个字是两个字节,是gb2313、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. <form method="GET">
  7. <input name="name" />
  8. <input type="submit" value="输入中文提交" />
  9. </form>

测试结果,正常显示:

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

会乱码的原因。同理,如果我们把浏览器的默认编码调整为utf-8,那么输入url中的中文则会按照utf-8编码。

除了上面的之外,还有以下情况会出现这种情况:

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

方案1:

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

方案2:

  1. mb_convert_encoding($name, "utf-8", "gbk");  (亲测有效)

本文地址:http://www.92csz.com/03/986.html

php$get中文汉字参数乱码的更多相关文章

  1. asp.net url址址中中文汉字参数传递乱码解决方法

    中文乱码是网站开发中会常碰到的问题,今天我们来讲一下关于url址址中中文汉字参数传递乱码解决方法,有需要的朋友可以参考下.在cs文件里传参的时候用UrlEncode: Response.Redirec ...

  2. IE兼容之中文汉字请求乱码-network

    IE兼容之中文汉字请求乱码 IE控制台报错: IE网络报错: 解决方法: encodeURI('--- @ -- 子卿 -'); // "---%20@%20--%20%E5%AD%90%E ...

  3. jsp 接收汉字参数乱码

    这两天跟汉字问题较上劲了,真是考验基本功 1.  ${param.userName} 乱码 解决方法: <%String name = (String)request.getParameter( ...

  4. tomcat取带有中文的参数乱码的解决办法

    1. 对于post参数,可以用filter来处理,在dofilter之前,加入以下代码: request.setCharacterEncoding("UTF-8"); 2. 对于g ...

  5. SSH项目中,解决中文请求参数乱码,Filter过滤器不起作用的问题

    1.web.xml配置如下(必须放在Struts2配置之前) <!-- 字符编码过滤器配置--> <filter> <filter-name>CharEncodin ...

  6. [转]sp_OACreate WriteLine Writing nvarchar 中文汉字 非乱码to a text file

    本文转自:https://stackoverflow.com/questions/48135889/writing-nvarchar-to-a-text-file According to the S ...

  7. ASP.NET开发在JavaScript有中文汉字时出现乱码时简单有效的解决

    一般情况在使用ASP.NET开发使用JavaScript有中文汉字时不会出现乱码情况,比如:alert('您看到我了吗?');这样直接输入中文汉字的代码中是不会出现乱码的,如果出现了,一是检查Web. ...

  8. URL传参时中文参数乱码的解决方法

    URL传参时,中文参数乱码的解决: 今天在工作中遇到了这样的一个问题,在页面之间跳转时,我将中文的参数放入到url中,使用location进行跳转传参,但是发现接收到的参数值是乱码.我的代码是这样写的 ...

  9. spring mvc 中文参数乱码

    最近做项目,springmvc的url中文参数乱码: 请求url: http://localhost:8080/supply/supply_list.htm?productName=测试&is ...

随机推荐

  1. worktools-git 工具的使用总结(2)

    1.创建分支 git branch son parent //创建分支,是在master 分支的基础上创建 :~/myGit$ git st # On branch master nothing to ...

  2. 父子margin塌陷

    1.使用padding 2.给父级使用border 3.给父级添加属性 overflow:hidden 4.浮动 5.定位{absolute,fixed} 6.伪元素代码 .parent:before ...

  3. C#创建子线程,子线程使用委托更新控件

    一.背景 由于在窗体程序中通过点击一个button按键后需要更新TreeView控件的内容,由于等待时间比较长,主程序无法一起在那边等待,需要去处理其它的事情,所以就需要创建新的子线程来处理.因为主线 ...

  4. Servlet 规范笔记—基于http协议的servlet

    在上一章节,我们大概的描述了servlet的规范以及servlet和servlet容器的概念和用途,我们清楚的知道servlet容器提供了接收来自client端的请求,然后根据请求进行处理(如:执行对 ...

  5. java 之 wait, notify, park, unpark , synchronized, Condition

    1. wait notify /** * 解释: 唤醒一个等待monitor的线程, 如果有多个线程在等待,会唤醒一个. * 一个线程在等待monitor是由Object.wait引起的 * 获取一个 ...

  6. color-在framwork中添加属性变量

    1.今天在修改framwork中的代码的时候,需要把自己在代码中写的一个#ffffff,变成在xml中引用的变量.具体操作方法如下 1)在 frameworks/base/core/res/res/v ...

  7. 104.tcp多线程读写实现群聊

    客户端: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<stdlib.h> #include <w ...

  8. 洛谷 P1205 [USACO1.2]方块转换 Transformations

    P1205 [USACO1.2]方块转换 Transformations 题目描述 一块N x N(1<=N<=10)正方形的黑白瓦片的图案要被转换成新的正方形图案.写一个程序来找出将原始 ...

  9. [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''&lt;h1 style=&quot;text-align: center;&quot;&gt;php

    [Err] 1064 - You have an error in your SQL syntax; check the manual that corresponds to your MySQL s ...

  10. var let 区别

    var a = 5; var b = 10; if (a === 5) { let a = 4; // if 块级作用域 var b = 1; // 函数级作用域 console.log(a); // ...