`
luolonghao
  • 浏览: 120035 次
  • 性别: 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改成中文时也可以返回正确的结果。

参考文档:

 

 

分享到:
评论

相关推荐

    url编码和解码的jar的源文件

    这个类实现了`java.nio.charset.CharsetEncoder`和`java.nio.charset.CharsetDecoder`接口,提供了对URL编码和解码的便捷方法。以下是一些关键方法: 1. `encode(String source, String charset)`: 这个方法用于...

    jsp使用URL编码传递中文参数问题.doc

    5. **浏览器兼容性**:不同的浏览器对URL编码和解码的处理可能存在差异,因此在处理中文参数时,需要确保代码兼容主流浏览器,例如Chrome、Firefox、Safari和IE等。 6. **最佳实践**:为了避免编码问题,一种好的...

    URL编码以及GET和POST提交乱码解决方案

    在IT行业中,网络通信是不可或缺的一部分,而URL编码、GET和POST提交以及乱码问题则是开发者经常遇到的技术挑战。本文将深入探讨这些知识点,并提供相应的解决方案。 首先,URL编码是因URL(统一资源定位符)中不能...

    java中文乱码之解决URL中文乱码问题的方法

    URL中文乱码问题主要是由于URL编码和解码过程中的不一致导致的。下面将详细介绍如何解决这个问题,并探讨几种常用的方法。 首先,我们需要了解URL编码的基本原理。URL(统一资源定位符)不能包含某些特殊字符,如...

    【JavaScript源代码】基于网址URL中特殊字符转义编码.docx

    【JavaScript源代码】基于网址URL中特殊字符转义...了解和正确使用URL编码是编写健壮的JavaScript应用和网页的重要部分。正确编码URL能确保数据安全无误地从客户端传递到服务器,避免因字符编码引发的错误和安全问题。

    http请求编码格式解析.doc

    在HTTP通信中,请求编码主要涉及GET和POST两种请求方式以及URL编码,这些都关乎数据如何在网络上传输。本篇将详细阐述GET与POST的区别以及URL编码的相关知识。 1. GET与POST请求的区别 GET请求和POST请求是HTTP协议...

    常用中文编码显示及转换

    本文将深入探讨“常用中文编码显示及转换”的主题,包括汉字的页面编码、URL编码,以及在GBK和UTF-8之间的转换方法。同时,我们还将分析提供的源码文件,以了解其实现细节。 首先,我们要明白汉字的页面编码。页面...

    web开发中url乱码处理

    URL编码和解码是解决这个问题的关键。以下是关于如何处理URL乱码的详细知识点: 1. **URL编码原理**:URL(Uniform Resource Locator)中的非ASCII字符需要进行编码,以确保它们在网络上传输时不引起混淆。在...

    url参数中传递特殊字符处理方法

    因此,对于中文字符串来说,如果不希望把字符串编码格式转化成 UTF-8 格式的(比如原页面和目标页面的 charset 是一致的时候),只需要使用 escape。如果你的页面是 GB2312 或者其他的编码,而接受参数的页面是 UTF-...

    pb9.0 UTF-8 编码转换为Unicode 编码格式

    PowerBuilder9.0开发环境下,可以把UTF-8的编码转换为Unicode的编码格式,在pb9.0环境下测试通过。

    JAVA字符编码系列三[借鉴].pdf

    Java开发者在处理字符编码时,需要理解各种编码之间的关系和转换规则,特别是在跨平台和国际化的应用中,正确处理字符编码至关重要,可以避免乱码问题,确保数据的准确传输和存储。同时,了解这些知识也有助于解决...

    Java设置String字符串编码方法详解

    4. URL编码和解码 在网络编程中,URL中可能包含非ASCII字符,这时需要使用`URLEncoder.encode()`和`URLDecoder.decode()`进行编码和解码: ```java String urlStr = "http://example.com/?name=张三"; String ...

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

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

    乱码 编码方式解决 gbk ISO8859-1 utf8 编码

    在计算机科学与信息技术领域中,字符编码是一个至关重要的概念,它直接关系到文本数据的正确存储、传输与显示。本文将针对标题中的几种常见编码格式(GBK、ISO 8859-1、UTF-8)以及如何解决由这些编码方式引发的乱码...

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

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

    java字符串编码获取

    Java的`URLEncoder.encode()`和`URLDecoder.decode()`方法可用于进行URL编码和解码。 7. 国际化与本地化 Java支持国际化(i18n)和本地化(l10n),允许程序根据用户的地区和语言偏好显示适当的内容。这涉及到`...

    nls_charset12 ojdbc14

    NLS_CHARSET12可能是特定的字符集代号,如AL32UTF8或WE8ISO8859P1等,用于定义数据存储和显示的字符编码。字符集的选择对数据库的全球化和多语言支持至关重要,因为它决定了数据库如何处理各种语言的字符。不同的...

    常用编码VBA.zip

    在"常用编码VBA.zip"这个压缩包中,包含了一系列用于处理不同编码方式的VBA宏,如Base64编码、Quoted-Printable编码、URL编码、UTF8编码和Unicode编码。 1. **Base64编码**:Base64是一种用64个字符来表示任意二...

    java字符编码监听器

    在Java Servlet规范中,提供了`SetCharacterEncodingFilter`这样的过滤器,用于确保请求参数和响应内容的正确编码,避免因为编码不一致导致的数据乱码问题。 1. **字符编码的重要性** 在网络通信中,字符编码扮演...

Global site tag (gtag.js) - Google Analytics