URL编码总结

          URL是Universal Resource Locator的简称。翻译过来那就是统一资源定位符,好吧,我们常常会俗称为网页地址。

一个URL的格式一般是这种:协议类型://server地址(必要时需加上port号)/路径/文件名称?參数。比方http://zh.wikipedia.org:80/w/index.php?title=Special,协议是HTTP。server地址是zh.wikipedia.org,port是80,路径和文件名称是/w/index.php。參数是title=Special。还有个与URL相关的概念URI。URI是统一资源标示符,URL是URI的一种,用于标示互联网资源,并指定了对资源的操作和获取方法。URL大部分情况下都仅仅有英文字符,这样也就不存在编码问题。假设URL中有了中文。那么编码规则是什么呢?实际上,RFC并没有标准规定URL的编码方式,所以不同的浏览器的表现可能是不同的。以下就总结下。主要參考了阮一峰的关于URL编码一文,当然有些地方我測试的结果会有所不同,大家能够依据自己的系统环境进行区分。



1 URL路径中包括中文

       假设URL路径中包括中文,经过測试发现无论IE6.0还是Chrome。编码都是採用的UTF-8。其它浏览器临时没有測试。猜想应该一致。

測试的URL是:http://zh.wikipedia.org/wiki/中文.在chrome的开发人员工具中能够看到实际的URL是http://zh.wikipedia.org/wiki/%E4%B8%AD%E6%96%87,当中E4B8AD E69687正是"中文"的UTF-8编码。

2 URL查询參数中包括中文

       假设查询參数中包括中文。则经过測试发现,IE6.0採用的是操作系统编码,Chrome採用的是UTF-8编码

測试的URL是:http://www.baidu.com/s?wd=中文。通过測试能够发现。在IE6以下“中文”实际被转成了%B0%D9%B6%C8。chrome以下则转成了%E4%B8%AD%E6%96%87。



3 表单參数的中文编码

       表单提交时,无论是IE6还是Chrome,參数中中文的编码则依据HTML代码中指定的字符编码来决定(也就是html代码中标签指定的字符编码)。

当然这是在form中没有指定accept-charset的情况下,假设form中加了accept-charset="GBK”属性,则表单參数则由accept-charset指定编码进行编码。

測试代码例如以下:

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>測试</title>
</head>
<body>
<h2>表单中文编码測试</h2>
<form method="GET" action="http://www.baidu.com/s">
<input type="text" name="wd">
<input type="submit" value="OK">
</form>
</body>
</html>

能够发现,当指定charset=UTF-8时,你在输入项输入“中文”。则实际提交后会用UTF-8编码成%E4%B8%AD%E6%96%87,而假设charset=GBK。则输入项会用GBK编码成%D6%D0%CE%C4。

用POST方法也是一样的。

而假设加上accept-charset属性。代码改成以下这样。则表单參数编码由accept-charset中指定的编码来决定。

例如以下所看到的,尽管meta中指定的是UTF-8编码。可是表单參数是GBK编码的。

<html>
<head>
<meta http-equiv="Content-Type" content="text/html;charset=UTF-8">
<title>測试</title>
</head>
<body>
<h2>表单中文编码測试</h2>
<form method="GET" action="http://www.baidu.com/s" accept-charset="GBK">
<input type="text" name="wd">
<input type="submit" value="OK">
</form>
</body>
</html>

另一点须要注意的是,假设输入项包括空格,比方“中文 哈哈”,则空格会被编码为+。

4 Javascript HTTP的中文參数编码

之前说的是直接通过浏览器发HTTP请求的中文编码情况,那假设是通过Javascript发送HTTP请求,会是什么情况呢?依据測试发现,通过Javascript发送的HTTP请求。IE6的为操作系统编码。Chrome中文參数编码是UTF-8

測试:能够打开Chrome的http://zh.wikipedia.org/wiki/%E4%B8%AD%E6%96%87。在开发人员工具的控制台输入$.ajax("/wiki/英语"),能够在网络连接中发现"英语"採用的UTF-8编码。IE中能够另外编辑一个測试的网页,用JS測试就可以。

5 Javascript编码函数

前面说的非常多种中文编码情况。不同的浏览器处理方式也不尽同样。这是件非常纠结的事情,一个好的方法是採用JS的函数在表单提交前对參数进行统一处理。

第一个函数是escape,escape是一个全局函数。它使用十六进制的数字(%xx或%uxxxx)编码字符串为unicode码。

小于等于0xFF的字符将被转义为%xx。大于0xFF的将被转移为%uxxxx,能够使用unescape函数解码escape函数编码的字符串。escape已被ecma标准抛弃。如今一般推荐使用encodeURI或encodeURIComponent函数取代。

escape实例: escape(“中文”)的结果是"%u4E2D%u6587",escape("abc def")的结果是"abc%20def",空格编码为0x20。

不管网页编码是什么,经过JS的escape操作后,都会变成unicode码。如第3节提到的,因为表单提交时參数中的空格会被编码为+,所以escape函数不正确"+"进行编码,所以escape("abc+def")结果还是"abc+def"。

第二个函数是encodeURI,它也是全局函数。encodeURI的目的是採用UTF-8给URI进行编码。

ASCII的字母、数字不编码。- _ . ! ~ * ' ( )也不编码,URI中具有特殊意义的字符也不编码(如; / ? : @ & = + $ , #等)。

參数中的其它字符将转换成UTF-8编码方式的字符。并使用十六进制转义序列(%xx)生成替换。

相应的解码函数是decodeURI。

encodeURI实例:encodeURI("測试 http://www.baidu.com/test?v=ab cd+@#")结果为"%E6%B5%8B%E8%AF%95%20http://www.baidu.com/test?

v=ab%20cd+@#"。

第三个函数是encodeURIComponent,与encodeURI不同的是,它会对特殊符号如"; / ?

: @ & = + $ , #"进行编码。解码函数是decodeURIComponent。

encodeURIComponent实例:encodeURIComponent("測试 http://www.baidu.com/test?v=ab cd+@#")结果为%E6%B5%8B%E8%AF%95%20http%3A%2F%2Fwww.baidu.com%2Ftest%3Fv%3Dab%20cd%40%23%2B。

6 參考资料

URL编码总结的更多相关文章

  1. url 编码(percentcode 百分号编码)(转载)

    原文地址:http://www.cnblogs.com/leaven/archive/2012/07/12/2588746.html   http://www.imkevinyang.com/2009 ...

  2. 【原】聊一聊 url 编码问题

    最近项目中遇到需要编码的一个问题,在encode和encodeURIComponent上绕了个小圈,所以打算总结一下js的编码问题,网上也有很多类似的文章,不过呢,总结出来的东西才是自己滴 为什么需要 ...

  3. Owin的URL编码怎么搞?以前都是HttpUtility.UrlEncode之类的,现在连system.web都没了,肿么办?

    Owin的URL编码怎么搞?以前都是HttpUtility.UrlEncode之类的,现在连system.web都没了,肿么办? 编码: Uri.EscapeDataString(name) 解码: ...

  4. 【基础进阶】URL详解与URL编码

    作为前端,每日与 URL 打交道是必不可少的.但是也许每天只是单纯的用,对其只是一知半解,随着工作的展开,我发现在日常抓包调试,接口调用,浏览器兼容等许多方面,不深入去理解URL与URL编码则会踩到很 ...

  5. 【阮一峰】深入研究URL编码问题及JavaScript相应的解决方案

    作者: 阮一峰 日期: 2010年2月11日 一.问题的由来 URL就是网址,只要上网,就一定会用到. 一般来说,URL只能使用英文字母.阿拉伯数字和某些标点符号,不能使用其他文字和符号.比如,世界上 ...

  6. delphi URL 编码的转换

    先介绍一下,Delphi中处理Google的URL编码解码,其中就会明白URL编码转换的方法的 从delphi的角度看Google(谷歌)URL编码解码方式 在网上搜索了一下,似乎没有什么关于goog ...

  7. sed处理url编码解码=== web日志的url处理

    URL 编码/解码方法(linux  shell实现),方法如下: 1.编码的两种方法: admin@~ 11:14:29>echo '手机' | tr -d '\n' | xxd -plain ...

  8. url编码

    url编码 情况1:网址路径中包含汉字 打开IE,输入网址”http://zh.wikipedia.org/wiki/春节”.注意,”春节”这两个字此时是网址路径的一部分. 查看HTTP请求的头信息, ...

  9. URL编码和解码工具

    开发中发现需要进行URL的编解码,每次百度出来的还带广告而且比较慢,写了一个本地的工具,比较简单,希望对大家有帮助. <!DOCTYPE html PUBLIC "-//W3C//DT ...

  10. URL编码 utf-8 gb2312的区别

    一.问题的由来 URL就是网址,只要上网,就一定会用到. 一般来说,URL只能使用英文字母.阿拉伯数字和某些标点符号,不能使用其他文字和符号.比如,世界上有英文字母的网址“http://www.abc ...

随机推荐

  1. select onchange事件的使用

    <select name="expireDay" id="expireDay" class="form-control" onchan ...

  2. [IOS初学]ios 第一篇 storyboard 与viewcontroller的关系 - Zoe_J

    时间 2014-07-27 16:08:00  博客园-所有随笔区 原文  http://www.cnblogs.com/zoe-j/p/3871501.html 主题 StoryBoard 学习了一 ...

  3. 为公司内部搭建CA

    步骤一 首先我们要知道CA的配置文件 openssl的配置文件:/etc/pki/tls/openssl.cnf 我们打开这个配置文件 这文件中很多跟CA相关的信息如图 解释: 我们可以搭建好几个CA ...

  4. fit in gnuplot

    Table of Contents 1. fit-gnuplot 1 fit-gnuplot syntax >> fit [xrange][yrange] function 'datafi ...

  5. 数据结构实验4:C++实现循环队列

    实验4 4.1 实验目的 熟练掌握队列的顺序存储结构和链式存储结构. 熟练掌握队列的有关算法设计,并在循环顺序队列和链队列上实现. 根据具体给定的需求,合理设计并实现相关结构和算法. 4.2 实验要求 ...

  6. luogu1463 [HAOI2007]反素数

    以下证明来自算法竞赛进阶指南 引理一: 答案就是 \([1,n]\) 之间约数个数最多的最小的数. 证明: 记 \(m\) 是 \([1,n]\) 之间约数个数最多的最小的数.则 \(\forall ...

  7. 大数据学习——linux常用命令(二)

    二.目录操作 1 查看目录信息 ls / 查看根目录下的文件信息 ls . 或者 ls ./查看当前目录下的文件信息 ls ../查看根目录下 ls /home/hadoop ls -l . 查看当前 ...

  8. &quot;转成"

    在java中这样转 StringEscapeUtils.unescapeHtml(soapResponseData); 在js中这样转 str.replace(""",& ...

  9. 数据库连接 Mysqli

    //数据库连接 Mysqli $db= new Mysqli("localhost","root","root","asd_808 ...

  10. [luoguP2420] 让我们异或吧(dfs + 异或的性质)

    传送门 因为异或满足结合律和交换律. a^b^b=a 所以这个题直接求根节点到每个点路径上的异或值. 对于每组询问直接输出根到两个点的异或值的异或的值. ——代码 #include <cstdi ...