java中的URLEncoder.encode对应JS中用decodeURIComponent,js和java编码,解码
2016-12-05 15:39
555 查看
用get请求传中文,经常搞到乱码,这几天搞搞这个东西,总结一下,以方便以后处理这类的问题。
JAVA代码中的URLEncoder.encode方法和JS的encodeURIComponent功能差不多,它会将处字母和数字,以及*字符外的都编码成%xx形式。
JS的unescape和decodeURI都不能用来解码JAVA中URLEncoder.encode编码的字符串。
在JAVA代码中的URLEncoder.encode的字符串可以在JS中用decodeURIComponent还原成字符串。
在JAVA代码中可以用URLDecoder.decode(request.getParameter("param"),"UTF-8")来将在JS中用encodeURIComponent的参数还原成字符串。
========================================================
1、decodeURI()定义和用法:
decodeURI() 函数可对 encodeURI() 函数编码过的URI 进行解码。
语法:decodeURI(URIstring)
参数 描述:URIstring 必需。一个字符串,含有要解码的 URI 或其他要解码的文本。
返回值:URIstring 的副本,其中的十六进制转义序列将被它们表示的字符替换。
2、encodeURI 方法
将文本字符串编码为一个有效的统一资源标识符 (URI)。
encodeURI(URIString)
必选的 URIString 参数代表一个已编码的 URI。
说明
encodeURI 方法返回一个编码的 URI。如果您将编码结果传递给 decodeURI,那么将返回初始的字符串。encodeURI 方法不会对下列字符进行编码:":"、
"/"、";" 和 "?"。请使用 encodeURIComponent 方法对这些字符进行编码。
-----------------------------------------------------------------------------------------------------------
3、decodeURIComponent()定义和用法:decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码。
语法:decodeURIComponent(URIstring)
参数 描述:URIstring 必需。一个字符串,含有编码 URI 组件或其他要解码的文本。
返回值:URIstring 的副本,其中的十六进制转义序列将被它们表示的字符替换。
4、encodeURIComponent() 方法:
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( )。
因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者encodeURIComponent。
========================================================
示例代码如下:
javascript代码encode
java代码decode
在线转码工具http://tool.oschina.net/encode?type=4
1. escape
把特殊字符(不包括 + - * / . _ @)转化成相应的ASCII表示法(%XX)或者Unicode表示法(%uXXXX)
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(escape("+-*/._@ '()阳春三月"));
输出结果:
+-*/._@%20%27%28%29%u9633%u6625%u4E09%u6708
从结果中可以看出,+-*/._@不会被编码,空格转成%20,单引号转成%27,圆括号转成%28和%29,四个汉字用Unicode编码成四个%uXXXX序列。
如果我们对escape的字符序列再次调用escape:
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(escape(escape("+-*/._@ '()阳春三月")));
输出结果:
+-*/._@%2520%2527%2528%2529%25u9633%25u6625%25u4E09%25u6708
可以看出,escape会编码已经escape过的字符%为%25
调用unescape进行解码:
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(unescape(escape(escape("+-*/._@ '()阳春三月"))));
输出结果:
+-*/._@%20%27%28%29%u9633%u6625%u4E09%u6708
再次调用escape进行解码:
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(unescape(unescape(escape(escape("+-*/._@ '()阳春三月")))));
输出结果:
+-*/._@ '()阳春三月
所以在编写代码时,要注意被操作字符序列是否已经escape或unescape过。
2. encodeURI和encodeURIComponent
和escape类似,不同的是
a. 它们不会对(' tilde(加在西班牙语n字上的发音符号) ())编码:
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(encodeURI("+-*/._@ '()"));
输出结果:
+-*/._@%20'()
b. 它们编码Unicode字符也不同,输出为:%XX%XX or %XX%XX%XX
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(encodeURI("阳春三月"));
输出结果:
%E9%98%B3%E6%98%A5%E4%B8%89%E6%9C%88
encodeURI把每个中文字符都转成了%XX%XX%XX格式
3. encodeURI和encodeURIComponent区别:
encodeURIComponent会编码encodeURI不管的(, / ? : @ & = + $ #),其中,(+ / @)escape也不闻不问
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(encodeURI(",/?:@&=+$#"));
document.write(encodeURIComponent(",/?:@&=+$#"));
输出结果:
,/?:@&=+$#
%2C%2F%3F%3A%40%26%3D%2B%24%23
总结:
escape是元老级的方法,很多浏览器表示都支持,适用于html字符编码
encodeURI和encodeURIComponent出道较晚,适用于uri字符编码,并且后者对很多URI中可能出现的特殊字符都进行编码
JAVA代码中的URLEncoder.encode方法和JS的encodeURIComponent功能差不多,它会将处字母和数字,以及*字符外的都编码成%xx形式。
JS的unescape和decodeURI都不能用来解码JAVA中URLEncoder.encode编码的字符串。
在JAVA代码中的URLEncoder.encode的字符串可以在JS中用decodeURIComponent还原成字符串。
在JAVA代码中可以用URLDecoder.decode(request.getParameter("param"),"UTF-8")来将在JS中用encodeURIComponent的参数还原成字符串。
========================================================
1、decodeURI()定义和用法:
decodeURI() 函数可对 encodeURI() 函数编码过的URI 进行解码。
语法:decodeURI(URIstring)
参数 描述:URIstring 必需。一个字符串,含有要解码的 URI 或其他要解码的文本。
返回值:URIstring 的副本,其中的十六进制转义序列将被它们表示的字符替换。
2、encodeURI 方法
将文本字符串编码为一个有效的统一资源标识符 (URI)。
encodeURI(URIString)
必选的 URIString 参数代表一个已编码的 URI。
说明
encodeURI 方法返回一个编码的 URI。如果您将编码结果传递给 decodeURI,那么将返回初始的字符串。encodeURI 方法不会对下列字符进行编码:":"、
"/"、";" 和 "?"。请使用 encodeURIComponent 方法对这些字符进行编码。
-----------------------------------------------------------------------------------------------------------
3、decodeURIComponent()定义和用法:decodeURIComponent() 函数可对 encodeURIComponent() 函数编码的 URI 进行解码。
语法:decodeURIComponent(URIstring)
参数 描述:URIstring 必需。一个字符串,含有编码 URI 组件或其他要解码的文本。
返回值:URIstring 的副本,其中的十六进制转义序列将被它们表示的字符替换。
4、encodeURIComponent() 方法:
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( )。
因此,对于中文字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(比如原页面和目标页面的charset是一致的时候),只需要使用escape。如果你的页面是GB2312或者其他的编码,而接受参数的页面是UTF-8编码的,就要采用encodeURI或者encodeURIComponent。
========================================================
示例代码如下:
javascript代码encode
escape encodeURI encodeURIComponent的使用和区别
escape(unescape),encodeURI(decodeURI)和encodeURIComponent(decodeURIComponent)都是用来编(解)码字符以利于在网络上传输和解析。1. escape
把特殊字符(不包括 + - * / . _ @)转化成相应的ASCII表示法(%XX)或者Unicode表示法(%uXXXX)
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(escape("+-*/._@ '()阳春三月"));
输出结果:
+-*/._@%20%27%28%29%u9633%u6625%u4E09%u6708
从结果中可以看出,+-*/._@不会被编码,空格转成%20,单引号转成%27,圆括号转成%28和%29,四个汉字用Unicode编码成四个%uXXXX序列。
如果我们对escape的字符序列再次调用escape:
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(escape(escape("+-*/._@ '()阳春三月")));
输出结果:
+-*/._@%2520%2527%2528%2529%25u9633%25u6625%25u4E09%25u6708
可以看出,escape会编码已经escape过的字符%为%25
调用unescape进行解码:
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(unescape(escape(escape("+-*/._@ '()阳春三月"))));
输出结果:
+-*/._@%20%27%28%29%u9633%u6625%u4E09%u6708
再次调用escape进行解码:
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(unescape(unescape(escape(escape("+-*/._@ '()阳春三月")))));
输出结果:
+-*/._@ '()阳春三月
所以在编写代码时,要注意被操作字符序列是否已经escape或unescape过。
2. encodeURI和encodeURIComponent
和escape类似,不同的是
a. 它们不会对(' tilde(加在西班牙语n字上的发音符号) ())编码:
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(encodeURI("+-*/._@ '()"));
输出结果:
+-*/._@%20'()
b. 它们编码Unicode字符也不同,输出为:%XX%XX or %XX%XX%XX
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(encodeURI("阳春三月"));
输出结果:
%E9%98%B3%E6%98%A5%E4%B8%89%E6%9C%88
encodeURI把每个中文字符都转成了%XX%XX%XX格式
3. encodeURI和encodeURIComponent区别:
encodeURIComponent会编码encodeURI不管的(, / ? : @ & = + $ #),其中,(+ / @)escape也不闻不问
Javascript代码
![](http://czj4451.iteye.com/images/icon_star.png)
document.write(encodeURI(",/?:@&=+$#"));
document.write(encodeURIComponent(",/?:@&=+$#"));
输出结果:
,/?:@&=+$#
%2C%2F%3F%3A%40%26%3D%2B%24%23
总结:
escape是元老级的方法,很多浏览器表示都支持,适用于html字符编码
encodeURI和encodeURIComponent出道较晚,适用于uri字符编码,并且后者对很多URI中可能出现的特殊字符都进行编码
相关文章推荐
- spring security oauth2.0 实现
- RxBus和RxManager管理rxJava的生命周期
- Eclipse 字体、字号的设置、最佳字体推荐
- myeclipse去除jsp校验错误
- Java基础--log4j
- SpringMVC与Struts2区别与比较总结
- Java Daemon 守护线程
- SpringMVC和Struts2的区别
- 编写程序,实现生成一随机字母(a~z)或(A~Z),如果是小写字母则转化成大写字母。
- 五、Java 多线程 并发编程#
- RABBITMQ/JAVA 客户端测试(再补:利用文件流)
- 四种Java线程池用法解析
- SpringBoot配置属性之DataSource
- Java并发系列-18、Java中的锁
- java annotation类型
- 基本排序算法的java实现
- myeclipse中的js文件报错
- Struts2中文乱码
- Spring Security3 - MVC 整合教程 (初识Spring Security3)
- java 浅层克隆和深层克隆(实现接口Cloneable)