URLEncoder.encode、URLDecoder.decode、escape、encodeURI、encodeURIComponent
2012-08-01 10:04
399 查看
转载自:http://hi.baidu.com/suofang/blog/item/4b0700f37d8527d00a46e010.html
采用ISOLatin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20,如果是中文,则使用unicode编码格式如%uxxxx。unescape方法与此相反。不会被此方法编码的字符有69个:@*_+-./,0-9,a-z,A-Z
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。encodeURI不编码字符有82个:~!@#$&*()_+:?-=;',./,0-9,a-z,A-Z
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如/等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则/字符被编码之后URL将显示错误。不会被此方法编码的字符71个:~!*()_-'.,0-9,a-z,A-Z
随便说说表单以POST方式提交时,表单元素值中的一些字符也会转换,但以下不做转换:+@*_-.,a-zA-Z0-9,要转换的字符会先用浏览器的编码方式时行编码,然后把编码转换成%xx(xx为两位的十六进制)形式参数串后传送到服务器。
Java中的URLEncoder.encode(Strings,Stringenc)/URLDecoder.decode(Strings,Stringenc)机制:它们与JavaScript中的encodeURI、encodeURIComponent函数在编码方式上是不一样的。encodeURI、encodeURIComponent用的是UTF-8,是不能更改的。但Java里的编解码函数不一定是UTF-8,这里的编码与
运行的环境是有关系的,默认情况下,在Tomcat5.5下是以ISO8859-1来解码URL中传递过来的参数的,但也可以设置URL的编码方式,比如Tomcat中设置URIEncoding与useBodyEncodingForURI属性是可以的,具体实例请看《HTTP码流与Jsp乱码问题的分析(一)》中的URLEncoder.encode()部分。
URLEncoder.encode(Strings,Stringenc)对String编码时,使用以下规则:
字母数字字符"
特殊字符"
空格字符""转换为一个加号"
所有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含3个字符的字符串"
例如,使用UTF-8编码机制,字符串"Thestringü@foo-bar"将转换为"The+string+%C3%BC%40foo-bar",因为在UTF-8中,字符ü编码为两个字节,C3(十六进制)和BC(十六进制),字符@编码为一个字节40(十六进制)。
URLDecoder.decode(Strings,Stringenc)转换过程正好与URLEncoder类使用的过程相反。假定已编码的字符串中的所有字符为下列之一:"
到"
转换中使用以下规则:
字母数字字符"
特殊字符"
加号"
将把"
注:以下代码中的Cookie中写入中文必须先URLEncoder.encode编码,在读取Cookie时用URLDecoder.decode编码后转化为中文
<%
Stringname="css枯黄";
Cookieck=newCookie(URLEncoder.encode("username"),URLEncoder.encode(name));
ck.setMaxAge(24*1000);
response.addCookie(ck);
out.println("写入Cookie完毕");
Cookie[]cookies=request.getCookies();
for(Cookiec:cookies){
if(c.getName().equals("username"))
{
out.println(URLDecoder.decode(c.getValue()));
}
}
%>
escape()方法
采用ISOLatin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20,如果是中文,则使用unicode编码格式如%uxxxx。unescape方法与此相反。不会被此方法编码的字符有69个:@*_+-./,0-9,a-z,A-Z
encodeURI()方法
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。encodeURI不编码字符有82个:~!@#$&*()_+:?-=;',./,0-9,a-z,A-Z
encodeURIComponent()方法
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如/等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则/字符被编码之后URL将显示错误。不会被此方法编码的字符71个:~!*()_-'.,0-9,a-z,A-Z
POST方式下的特殊字符转换
随便说说表单以POST方式提交时,表单元素值中的一些字符也会转换,但以下不做转换:+@*_-.,a-zA-Z0-9,要转换的字符会先用浏览器的编码方式时行编码,然后把编码转换成%xx(xx为两位的十六进制)形式参数串后传送到服务器。
Java中的URLEncoder.encode(Strings,Stringenc)/URLDecoder.decode(Strings,Stringenc)编码方式
Java中的URLEncoder.encode(Strings,Stringenc)/URLDecoder.decode(Strings,Stringenc)机制:它们与JavaScript中的encodeURI、encodeURIComponent函数在编码方式上是不一样的。encodeURI、encodeURIComponent用的是UTF-8,是不能更改的。但Java里的编解码函数不一定是UTF-8,这里的编码与运行的环境是有关系的,默认情况下,在Tomcat5.5下是以ISO8859-1来解码URL中传递过来的参数的,但也可以设置URL的编码方式,比如Tomcat中设置URIEncoding与useBodyEncodingForURI属性是可以的,具体实例请看
URLEncoder.encode(Strings,Stringenc)对String编码时,使用以下规则:
字母数字字符"
a"到"
z"、"
A"到"
Z"和"
0"到"
9"保持不变。
特殊字符"
."、"
-"、"
*"和"
_"保持不变。
空格字符""转换为一个加号"
+"。
所有其他字符都是不安全的,因此首先使用一些编码机制将它们转换为一个或多个字节。然后每个字节用一个包含3个字符的字符串"
%xy"表示,其中xy为该字节的两位十六进制表示形式。推荐的编码机制是UTF-8。但是,出于兼容性考虑,如果未指定一种编码,则使用相应平台的默认编码。
例如,使用UTF-8编码机制,字符串"Thestringü@foo-bar"将转换为"The+string+%C3%BC%40foo-bar",因为在UTF-8中,字符ü编码为两个字节,C3(十六进制)和BC(十六进制),字符@编码为一个字节40(十六进制)。
URLDecoder.decode(Strings,Stringenc)转换过程正好与URLEncoder类使用的过程相反。假定已编码的字符串中的所有字符为下列之一:"
a"到"
z"、"
A"到"
Z"、"
0"
到"
9"和"
-"、"
_"、"
."以及"
*"。允许有"
%"字符,但是将它解释为特殊转义序列的开始。
转换中使用以下规则:
字母数字字符"
a"到"
z"、"
A"到"
Z"和"
0"到"
9"保持不变。
特殊字符"
."、"
-"、"
*"和"
_"保持不变。
加号"
+"转换为空格字符""。
将把"
%xy"格式序列视为一个字节,其中xy为8位的两位十六进制表示形式。然后,所有连续包含一个或多个这些字节序列的子字符串,将被其编码可生成这些连续字节的字符所代替。可以指定对这些字符进行解码的编码机制,或者如果未指定的话,则使用平台的默认编码机制。
注:以下代码中的Cookie中写入中文必须先URLEncoder.encode编码,在读取Cookie时用URLDecoder.decode编码后转化为中文
<%
Stringname="css枯黄";
Cookieck=newCookie(URLEncoder.encode("username"),URLEncoder.encode(name));
ck.setMaxAge(24*1000);
response.addCookie(ck);
out.println("写入Cookie完毕");
Cookie[]cookies=request.getCookies();
for(Cookiec:cookies){
if(c.getName().equals("username"))
{
out.println(URLDecoder.decode(c.getValue()));
}
}
%>
相关文章推荐
- URLEncoder.encode、URLDecoder.decode、escape、encodeURI、encodeURIComponent、
- URLEncoder.encode、URLDecoder.decode、escape、encodeURI、encodeURIComponent
- HttpUtility.UrlDecode(),HttpUtility()escape()、encodeURI()、encodeURIComponent()区别详解以及相应的前台解码和.net后台解码
- javascript中escape()、unescape()、encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent()比较
- js url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介
- JS 字符串编码函数(解决URL特殊字符传递问题):escape()、encodeURI()、encodeURIComponent()区别详解
- JS中URL中的特殊字符问题:escape,encodeURI,encodeURIComponent(转)
- js对url转码的三个函数escape,encodeURI,encodeURIComponent
- encodeURIComponent编码 URLDecoder.decode解码乱码的问题
- encodeURIComponent编码 URLDecoder.decode解码乱码的问题
- URL 编码方法比较 Encode,Javascript,escape,encodeURI,encodeURIComponent,UTF-8
- IE8get方法携带乱码(url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介)
- URL传递过程中几种编码escape()、encodeURI()、encodeURIComponent()
- javascript中escape()、unescape()、encodeURI()、encodeURIComponent()、decodeURI()、decodeURIComponent()比较
- url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介
- JS中URL中的特殊字符问题:escape,encodeURI,encodeURIComponent
- url的三个js编码函数escape(),encodeURI(),encodeURIComponent()简介【转】
- escape, unescape, encodeURI, decodeURI, encodeURIComponent, decodeURIComponent 等方法的对比分析
- 使用escape、encodeURI 和 encodeURIComponent 解决url中文乱码问题
- js编解码方式:escape,encodeURI,encodeURIComponent,unescape,decodeURI,decodeURIComponent