`
luolonghao
  • 浏览: 118083 次
  • 性别: Icon_minigender_1
  • 来自: Shanghai
社区版块
存档分类
最新评论

charset和URL编码关系

阅读更多

名词解释

charset: GBK、UTF-8、EUC-KR、Shift-JIS 等
URL编码:HTML form提交、JS里的encodeURIComponent函数

 

测试环境:

服务器:本地安装Apache,www根目录下放2个HTML页面(gbk.html和utf8.html),用Fiddler查看HTTP请求,或者tail -f access_log。

 

操作系统:Windows XP

 

浏览器版本:IE8、Firefox 10、Chrome 17、Opeara 11

 

form提交和encodeURIComponent的区别

  • form提交(application/x-www-form-urlencoded):根据当前页面的charset进行URL编码。通过submit button提交,或者用form.submit()方法提交。在gbk.html页面【土豆】会变成【%CD%C1%B6%B9】,在utf8.html页面【土豆】会变成【%E5%9C%9F%E8%B1%86】。还有,form提交会把空格替换成加号(+),这个和RFC1738不一致,PHP里对应的函数是urlencode。
  • encodeURIComponent函数:不管页面的charset,都按UTF-8来处理,所以在gbk.html和utf8.html页面上执行encodeURIComponent("土豆")之后都得到 【%E5%9C%9F%E8%B1%86】。encodeURIComponent完全符合RFC1738,会把空格替换成【%20】,PHP里对应的函数是rawurlencode。

浏览器地址栏行为

1. 打开encode后的URL:

 

GBK页面:

打开 http://localhost/gbk.html?kw=%CD%C1%B6%B9 :

所有浏览器的地址栏直接显示 http://localhost/gbk.html?kw=%CD%C1%B6%B9。Opera比较特殊,默认隐藏GET参数部分,焦点移到地址栏时显示完整URL。

 

UTF-8页面:

打开 http://localhost/utf8.html?kw=%E5%9C%9F%E8%B1%86 :

IE、Opera:直接显示URL,http://localhost/utf8.html?kw=%E5%9C%9F%E8%B1%86

Firefox、Chrome:把URL解码后显示, http://localhost/utf8.html?kw=土豆

 

2. 打开encode前的URL:

 

在浏览器地址栏直接输入带中文参数的URL按回车,有些浏览器会对中文进行URL编码,这个行为在不同浏览器不太一致。

 

打开 http://localhost/gbk.html?kw=土豆 :

 

IE:无处理,发送 http://localhost/gbk.html?kw=土豆

Opera:URL编码, http://localhost/gbk.html?kw= %CD%C1%B6%B9

Firefox、Chrome:UTF8 + URL编码, http://localhost/gbk.html?kw=%E5%9C%9F%E8%B1%86

 

URL里带中文时需要看具体操作系统和浏览器,没有统一的标准。IE根据OS字符编码直接发送中文,Opera也是根据OS编码发送中文,只不过多一个URL编码处理。Firefox和Chrome一律按UTF-8字符处理,并进行URL编码。同事反映Firefox中文版是按OS编码发送中文,这个和Firefox本身的URL解码一起会导致BUG。

 

结论:

  1. 避免在URL出现中文,如果需求上要求用中文,请参考2和3。
  2. 如果不是ajax处理,并URL包含中文,一般是网站的搜索功能,这时GET请求最好以form方式提交,不要使用location.href之类的,这样可以始终保持一致的编码。
  3. 后端获取GET数据后加is_utf8判断,比如GBK项目的话,可以添加str = is_utf8(str) ? utf8_to_gbk(str) : str; 处理,用户直接把URL改成中文时也可以返回正确的结果。

参考文档:

 

 

分享到:
评论

相关推荐

    JS对URL字符串进行编码/解码分析

    例如:发送页与接受页的编码格式(Charset)不一致(假设发送页面是GB2312而接收页面编码是 UTF-8),使用escape()转换传输中文字串就会出现乱码问题。 以下是JS下对URL进行编/解码的各种方法: escape 方法:返回一个...

    NChardet文本文件编码探测库源码,C#,txt文件编码自动探测

    NChardet文本文件编码探测库源码,C#,txt文件编码自动探测 用于自动探测TXT文本文件编码,支持GB2312、UTF-8、ASCII等几乎所有主流编码的探测,使用方法如下: static public Encoding GetEncoding(string bookPath...

    JS表单传值和URL编码转换

    因为URL传过去的数据不支持中文字符和一些特殊符号 所以需要转换一下编码 实现效果:网页1的表单数据传到网页2并显示出来 网页1代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta ...

    web程序开发中的URL乱码解决方案

    在服务器端/后台/后台程序中设置请求流和响应流的编码方式和页面上的编码方式一致:request().setCharacterEncoding("utf-8");response().setCharacterEncoding("ut f-8");response().setContentType("text/html;...

    常用编码VBA.zip

    常用编码的VBA宏,包括Base64编码、Quoted-Printable编码、URL编码、UTF8编码、Unicode编码等

    url中文字符解码

    通过URLEncoder.encode加密地址栏url上得中文字符, 并可通过java.net.URLDecoder.decode(str, charset)解密中文

    script标签的 charset 属性使用说明

    定义和用法 charset 属性规定在外部脚本文件中使用的字符编码。 如果外部文件中的字符编码与主文件中的编码方式不同,就要用到 charset 属性。 默认的字符编码是 ISO-8859-1。 src 和 charset 属性 对特别长的 ...

    js 处理URL实用技巧

    例如:发送页与接受页的编码格式(Charset)不一致(假设发送页面是GB2312而接收页面编码是UTF-8),使用escape()转换传输中文字串就会出现乱码问题。 以下是JS下对URL进行编/解码的各种方法: escape方法:就对@*+/ A...

    js对字符串进行编码的方法总结(推荐)

    例如:发送页与接受页的编码格式(Charset)不一致(假设发送页面是GB2312而接收页面编码是UTF-8),使用escape()转换传输中文字串就会出现乱码问题。 以下是JS下对URL进行编/解码的各种方法: 1、escape 方法:返回...

    asp(JavaScript)自动判断网页编码并转换的代码

    charset=utf-8″> <title>JavaScript自动判断网页编码并转换</title> </head> <%Server.ScriptTimeout=9999999; function send_request(url){ var codedtext; ...

    Spring Data Jpa Mysql使用utf8mb4编码的示例代码

    主要介绍了Spring Data Jpa Mysql使用utf8mb4编码的示例代码,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    支付宝官方支付

    这里需要注意的地方是:<...中action的值是网关+编码格式参数,即https://www.alipay.com/cooperate/gateway.do? _input_charset=utf-8,GBK的编码格式可以为:https://www.alipay.com/cooperate /gateway.do?。

    antlr/chardet/cpdetector.jar

    charset = detector.detectCodepage(file.toURI().toURL()); } catch (Exception e) { log.error(e, e); } String charsetName = Const.GBK; if (charset != null) { if (charset.name().equals("US-ASCII")...

    detector探测器

    charset = detector.detectCodepage(f.toURL()); } catch (Exception ex) {ex.printStackTrace();} if(charset!=null){ System.out.println(f.getName()+"编码是:"+charset.name()); }else System.out....

    Delphi10中idHttpServer接收中文参数乱码的处理

    idHttpServer在开发中比较方便,一般情况都能应付。但在接收浏览器发送的带中文URL时,取参数就会是乱码。...控件又不能显示的设置这个charset,只能折衷地修改一下源码,以适应针对utf-8编码的转码。

    HTML开发王

    14.1 键入文字和使用字符编码(charset属性) 14.1.1 计算机文字字符编码简介 14.1.2 使用html文档字符集和选择字符编码 14.1.3 指定字符编码 14.1.4 字符编码的优先级 14.1.5 在html文档中使用字符引用 14.2 指定文档...

    mql连接时出现的中文问题

    3.在驱动url中的选项中设置字符集,jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=字符集; 4.在web显示页中设置显示的字符集, ; charset=字符集" language="java" import="java.sql.*" ...

    解决Python requests库编码 socks5代理的问题

    查了一些相关的资料,看了下requests的源码,只有在服务器响应的头部包含有Content-Type,且里面有charset信息,requests能够正确识别,否则就会使用默认的 ISO-8859-1编码。github中也有讨论这个问题,但requests的...

    asp.net 网页编码自动识别代码

    class Program { // 获取网页的HTML内容,根据网页的charset自动判断Encoding static string GetHtml(string url) { return GetHtml(url, null); } // 获取网页的HTML内容,指定Encoding static string GetHtml...

Global site tag (gtag.js) - Google Analytics