URL编码总结

URL编码总结

          URL是Universal Resource Locator的简称,翻译过来那就是统一资源定位符,好吧,我们经常会俗称为网页地址。一个URL的格式通常是这样的:协议类型://服务器地址(必要时需加上端口号)/路径/文件名?参数,比如http://zh.wikipedia.org:80/w/index.php?title=Special,协议是HTTP,服务器地址是zh.wikipedia.org,端口是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编码总结,布布扣,bubuko.com

时间: 2024-12-21 00:57:50

URL编码总结的相关文章

URL编码与解码

通常如果一样东西需要编码,说明这样东西并不适合传输.原因多种多样,如Size过大,包含隐私数据,对于Url来说,之所以要进行编码,是因为Url中有些字符会引起歧义. 例如Url参数字符串中使用key=value键值对这样的形式来传参,键值对之间以&符号分隔,如/s?q=abc&ie=utf-8.如果你的value字符串中包含了=或者&,那么势必会造成接收Url的服务器解析错误,因此必须将引起歧义的&和=符号进行转义,也就是对其进行编码. 又如,Url的编码格式采用的是ASC

url 编码(percentcode 百分号编码)

http://www.imkevinyang.com/2009/08/%E8%AF%A6%E8%A7%A3javascript%E4%B8%AD%E7%9A%84url%E7%BC%96%E8%A7%A3%E7%A0%81.html 摘要 本文主要针对URI编解码的相关问题做了介绍,对Url编码中哪些字符需要编码.为什么需要编码做了详细的说明,并对比分析了Javascript 中和编解码相关的几对函数escape / unescape,encodeURI / decodeURI和encodeUR

[iOS]URL编码和解码

1. 首先来看下什么样的是URL编码(字符串中带有%22 类似这样的) NSString *str = @"http://m.tuniu.com/api/home/data/index/c/%7B%22v%22%3A%227.1.0%22%2C%22ct%22%3A20%2C%22dt%22%3A1%2C%22p%22%3A11210%2C%22cc%22%3A2500%7D/d/%7B%22clientModel%22%3A%22HONOR+H30-L01%22%2C%22width%22%3

了解URL编码的基本概念,在javascript和java程序中使用内置的API进行编码和解码

1.URL编码的基本概念 URL只能使用US-ASCII 字符集来通过因特网进行发送.由于URL常常会包含 ASCII 集合之外的字符,URL必须转换为有效的 ASCII 格式.URL 编码使用 "%" 其后跟随两位的十六进制数来替换非 ASCII 字符.URL 不能包含空格,URL 编码通常使用 + 来替换空格.所谓URL编码,就是将非US-ASCII字符和US-ASCII中的特殊字符,用相应的字符集编码来表示.比如,汉字"你",如果用UTF-8编码,出现在URL

【转】C/C++ URL编码,解码(提取自PHP)

//解码 //头文件自己加上的 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <string> #include <iostream> using namespace std; /* {{{ php_htoi  */ static int php_htoi(char *s) { int value; int c; c = ((unsigned char *)

URL编码与两次encodeURI

当使用地址栏提交查询参数时,如果不编码,非英文字符会按照操作系统的字符集进行编码提交到服务器,服务器会按照配置的字符集进行解码,所以如果两者不一致就会导致乱码. encodeURI函数采用UTF-8对URL进行编码,所以如果服务器在进行解码时使用的是其他的编码方式就会出现乱码,默认的服务器配置的解码字符集都不是UTF-8,所以大部分情况下地址栏提交中文查询参数时会产生乱码:针对这种情况,可以连续使用两次encodeURI在客户端(主要指浏览器)对非英文字符进行编码,然后在服务端使用java.ne

百度移动版的url编码解码代码

1 var decode = function(m) { 2 try { 3 m = decodeURIComponent(m); 4 } catch(e) {} 5 var s = m.split("%"); 6 if (s.length > 1) { 7 s.shift(); 8 for(var i = 0; i < s.length; i++) { 9 var t = s[i]; 10 t = parseInt(t, 16); 11 t = t + 256; 12 t

URL 编码

简介 当我们每天上网冲浪时,有一些技术我们无时无刻不在面对.有数据本身(网页),数据的格式化,能够让我们获取数据的传输机制,以及让Web网络能够真正成为Web的基础及根本:从一页到另一页的链接.这些链接都是URL. 通用URL语法 我敢说每个人在其一生中至少见过一次URL.比如"http://www.google.com",就是一个URL.一个URL是一个统一资源定位器 ,事实上它指向了一个网页(大多数情况下).实际上,自从1994年的第一版规范开始,URL就有了一个良好定义的结构.

Web开发者应知的URL编码知识(转)

原文出处: lunatech   译文出处:oschina - 桔子, lwei, 史涛, Khiyuan, super0555, LinuxQueen, 抛出异常的爱 本文首先阐述了人们关于统一资源定位符(URL)编码的普遍的误读,其后通过阐明HTTP场景下的URL encoding 来引出我们经常遇到的问题及其解决方案.本文并不特定于某类编程语言,我们在Java环境下阐释问题,最后从Web应用的多个层次描述如何解决URL编码的问题来结尾. 简介 当我们每天上网冲浪时,有一些技术我们无时无刻不

url编码和解码

使用js在各个html页面之间传递参数的时候,有些特殊字符传过去再接收就会出现问题,最好的做法就是传递参数之前先编码,接收到之后再解码.搜集了一下常用的几个函数 1.escape http://www.w3school.com.cn/jsref/jsref_escape.asp 2.encodeURI http://www.w3school.com.cn/jsref/jsref_encodeuri.asp 3.encodeURIComponent http://www.w3school.com.