js中escape,encodeURI,encodeURIComponent函数和unescape,decodeURI和decodeURIComponent函数的功能
1.escape方法对String对象编码,escape方法返回一个包含了"转义序列"的字符串值。
除了ASCII字母和数字,以及这几个符号 *+-/.@_外(共有10+52+7=69个字符不会被编码),
其他所有的字符都会被转义序列替换,标准ASCII码内的字符(0-127)和扩展的ASCII码内
的字符(128-255)都用%xx编码形式代替。字符值大于255的以unicode%uxxxx格式存储。
注意 :escape方法不能够用来对统一资源标示符URI进行编码,因为=&?#等会被编码.
对URI编码应使用encodeURI,对URI参数用encodeURIComponent方法。
encodeURI除了ASCII字母和数字,以及这几个符号 *+-/.@_!#$&\'(),:=?~外(共有10+52+20=82个字符不会被编码),
其他所有的字符都会被转义序列替换,标准ASCII码内的字符(0-127)和扩展的ASCII码内
的字符(128-255)都用%xx编码形式代替。字符值大于255的以utf-8多字节%xx格式存储。
在URI中有特殊意义的字符如?=&等不会被编码。
encodeURIComponent除了ASCII字母和数字,以及这几个符号 *-_.~!'()外(共有10+52+9=71个字符不会被编码),
其他所有的字符都会被转义序列替换,标准ASCII码内的字符(0-127)和扩展的ASCII码内
的字符(128-255)都用%xx编码形式代替。字符值大于255的以utf-8多字节%xx格式存储。
可以看到?=&等在URI中有特殊意义的字符也会被编码。
encodeURIComponent方法在编码单个URIComponent(指请求参数)应当是最常用的,
它可以将参数中的中文、特殊字符进行转义,而不会影响整个URL。
一个测试的JSP实例:
访问http://localhost:8080/prjWebSec/encode/encdec.jsp?param=中文value>123NXX*+-/.@_!#$&'(),:=?~YES>^
输出为
可以看到escape和encodeURIComponent都会将? =等在URI中有特殊意义的字符进行了编码.
这样的话,URL就不能被正常访问了.
[如果你是在tomcat中测试的话,需要在server.xml中加上
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>]
2.unescape方法,解码用escape方法进行了编码的String对象。
unescape方法返回一个包含charstring内容的字符串值。
所有以%xx十六进制形式编码的字符都用ASCII字符集中等价的字符代替。
以%uxxxx格式(Unicode字符)编码的字符用十六进制编码xxxx对应的Unicode字符代替.
注意:unescape方法不能用于解码统一资源标识码(URI)。escape和unescape以经不推荐使用。
解码encodeURI和encodeURIComponent编码过的内容用decodeURI和decodeURIComponent方法。
JAVA代码中的URLEncoder.encode方法和JS的encodeURIComponent功能差不多,所以不应该用来对URI做encoding,
只应该对URI中的某一个参数值做编码。它会将处字母和数字,以及*字符外的都编码成%xx形式.
JS的unescape和decodeURI都不能用来解码JAVA中URLEncoder.encode编码的字符串。
在JAVA代码中的URLEncoder.encode的字符串可以在JS中用decodeURIComponent还原成字符串。
在JAVA代码中可以用URLDecoder.decode(request.getParameter("param"),"UTF-8")来将在JS中
用encodeURIComponent的参数还原成字符串
1.escape方法对String对象编码,escape方法返回一个包含了"转义序列"的字符串值。
除了ASCII字母和数字,以及这几个符号 *+-/.@_外(共有10+52+7=69个字符不会被编码),
其他所有的字符都会被转义序列替换,标准ASCII码内的字符(0-127)和扩展的ASCII码内
的字符(128-255)都用%xx编码形式代替。字符值大于255的以unicode%uxxxx格式存储。
注意 :escape方法不能够用来对统一资源标示符URI进行编码,因为=&?#等会被编码.
对URI编码应使用encodeURI,对URI参数用encodeURIComponent方法。
encodeURI除了ASCII字母和数字,以及这几个符号 *+-/.@_!#$&\'(),:=?~外(共有10+52+20=82个字符不会被编码),
其他所有的字符都会被转义序列替换,标准ASCII码内的字符(0-127)和扩展的ASCII码内
的字符(128-255)都用%xx编码形式代替。字符值大于255的以utf-8多字节%xx格式存储。
在URI中有特殊意义的字符如?=&等不会被编码。
encodeURIComponent除了ASCII字母和数字,以及这几个符号 *-_.~!'()外(共有10+52+9=71个字符不会被编码),
其他所有的字符都会被转义序列替换,标准ASCII码内的字符(0-127)和扩展的ASCII码内
的字符(128-255)都用%xx编码形式代替。字符值大于255的以utf-8多字节%xx格式存储。
可以看到?=&等在URI中有特殊意义的字符也会被编码。
encodeURIComponent方法在编码单个URIComponent(指请求参数)应当是最常用的,
它可以将参数中的中文、特殊字符进行转义,而不会影响整个URL。
一个测试的JSP实例:
- utilits:
- function writeToDom(str){
- document.writeln(str);
- }
- function writelnToDom(str){
- document.writeln(str + "<br>");
- }
- function writeURL(type,str){
- document.writeln(type +":<a href=\"" + str + "\">" + str + "</a><br>");
- }
- <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8" %>
- <%@ page import="java.net.URLDecoder,java.net.URLEncoder"%>
- <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
- <html>
- <head>
- <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
- <title>test encoding decoding</title>
- <script type="text/javascript" src="../js/utilits.js"></script>
- </head>
- <%
- String param = request.getParameter("param");
- System.out.println("original " + param);
- String urlEncodedparam = URLEncoder.encode("param=中文value>123NXX*+-/.@_!#$&\'(),:=?~YES>^","UTF-8");
- out.write("server side output ------------------------------------------------------- ");
- out.write("<br>original param: " + param);
- out.write("<br>decoded from original param: " + URLDecoder.decode(request.getParameter("param"),"UTF-8"));
- %>
- <script>
- writelnToDom("<br> client side output---------------------------------------------");
- var scriptVar='encdec.jsp?param=中文value>123NXX*+-/.@_YES<^';
- writeURL("escape",escape(scriptVar));
- var enuri='encdec.jsp?param=中文value>123NXX*+-/.@_!#$&\'(),:=?~YES>^';
- writeURL("encodeURI",encodeURI(enuri)); //只有这个做法的URL最终可用被正确访问
- var enuricomp='encdec.jsp?param=中文value>123NXX*-_.~!\'()YES>^';
- writeURL("encodeURIComponent",encodeURIComponent(enuricomp));
- writeURL("URLEncoder","<%=urlEncodedparam%>");
- writelnToDom("unescape URLEncoder:" + unescape("<%=urlEncodedparam%>"));
- writelnToDom("decodeURI URLEncoder:" + decodeURI("<%=urlEncodedparam%>"));
- writelnToDom("decodeURIComponent URLEncoder:" + decodeURIComponent("<%=urlEncodedparam%>"));
- </script>
- <body>
- </body>
- </html>
输出为
- server side output -------------------------------------------------------
- original param: 中文value>123NXX* -/.@_!
- decoded from original param: 中文value>123NXX* -/.@_!
- client side output---------------------------------------------
- escape:encdec.jsp%3Fparam%3D%u4E2D%u6587value%3E123NXX*+-/.@_YES%3C%5E
- encodeURI:encdec.jsp?param=%E4%B8%AD%E6%96%87value%3E123NXX*+-/.@_!#$&'(),:=?~YES%3E%5E
- encodeURIComponent:encdec.jsp%3Fparam%3D%E4%B8%AD%E6%96%87value%3E123NXX*-_.~!'()YES%3E%5E
- URLEncoder:param%3D%E4%B8%AD%E6%96%87value%3E123NXX*%2B-%2F.%40_%21%23%24%26%27%28%29%2C%3A%3D%3F%7EYES%3E%5E
- unescape URLEncoder:param=??-???value>123NXX*+-/.@_!#$&'(),:=?~YES>^
- decodeURI URLEncoder:param%3D中文value>123NXX*%2B-%2F.%40_!%23%24%26'()%2C%3A%3D%3F~YES>^
- decodeURIComponent URLEncoder:param=中文value>123NXX*+-/.@_!#$&'(),:=?~YES>^
这样的话,URL就不能被正常访问了.
[如果你是在tomcat中测试的话,需要在server.xml中加上
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443" URIEncoding="UTF-8"/>]
2.unescape方法,解码用escape方法进行了编码的String对象。
unescape方法返回一个包含charstring内容的字符串值。
所有以%xx十六进制形式编码的字符都用ASCII字符集中等价的字符代替。
以%uxxxx格式(Unicode字符)编码的字符用十六进制编码xxxx对应的Unicode字符代替.
注意:unescape方法不能用于解码统一资源标识码(URI)。escape和unescape以经不推荐使用。
解码encodeURI和encodeURIComponent编码过的内容用decodeURI和decodeURIComponent方法。
JAVA代码中的URLEncoder.encode方法和JS的encodeURIComponent功能差不多,所以不应该用来对URI做encoding,
只应该对URI中的某一个参数值做编码。它会将处字母和数字,以及*字符外的都编码成%xx形式.
JS的unescape和decodeURI都不能用来解码JAVA中URLEncoder.encode编码的字符串。
在JAVA代码中的URLEncoder.encode的字符串可以在JS中用decodeURIComponent还原成字符串。
在JAVA代码中可以用URLDecoder.decode(request.getParameter("param"),"UTF-8")来将在JS中
用encodeURIComponent的参数还原成字符串