Javascript的URL编码问题。
Javascript的常用的编码方式:
encodeURIComponent(stringvalue)和decodeURIComponent(stringvalue)
encodeURI(stringvalue)和decodeURI(stringvalue)
escape(stringvalue) 和unescape(stringvalue)
现在escape(stringvalue) 和unescape(stringvalue)已经从ECMAScript v3 已从标准中删除了 ,并反对使用它,因此应该用 decodeURI() 和 decodeURIComponent() 取而代之。
Java的编码解码:
URLEncoder.encode(stringvalue,"UTF-8")
对应
encodeURIComponent(stringvalue)
Java解码
URLDecoder.decode(stringvalue,"UTF-8")
对应
decodeURIComponent(stringvalue)
淘宝用的框架是WEBX,WebX中会把所有的参数按配置进行一次解码,淘宝大多应用系统都是GBK的编码,所以会存在Javascript编码后传给服务端拿到的是错误的编码。原因:
JavascriptAjax请求时:encodeURIComponent()后UTF-8编码WebX以GBK编码解码出错。解决:encodeURIComponent(encodeURIComponent(stringvalue))两次编码后传送到服务端,WEBX解码后是正常的UTF-8编码的字符串,在用URLDecoder.decode(stringvalue,"UTF-8")进行一次解码得到最后正确编码的汉字。这个在WEB旺旺和阿里云的旺旺服务器的聊天记录的查看是这样的做的。
原来还有很多遗留的系统的前端JS用的escape(stringvalue) 和unescape(stringvalue)进行的编码的解码。像老得旺旺的亮灯就是这样子做的 ,如:URL:
http://webwwtb.im.alisoft.com/wangwang/ww1.htm?t=1293428880513&uid=&tid=%u7EA4%u5C18yoyo。
这个URL中:“%u7EA4%u5C18yoyo”(纤尘yoyo)是用escape(stringvalue)进行编码的这个编码在JAVA端是解码不开的,并且我们在服务端用JAVA的HttpRequest.getParameter(name)接口取出来时候拿不到“%u7EA4%u5C18yoyo”原样的字符串,Java会自动处理掉这个拿到是:“EA4C18yoyo”,无论怎样也还原不成“纤尘yoyo”。并且我们现在又不能不老的亮灯全部找出来修改成encodeURIComponent(stringvalue)方法。
解决方法:
1、 用HttpRequest. getQueryString()拿到所有的求情的参数查询串。
2、 自己写一个JAVA的方法实现 和javascript的unescape(stringvalue)的解码方式一样的解码功能。
注意:在写前端代码时候一定不要用escape(stringvalue) 和unescape(stringvalue),用了这两个方法在和服务端交互的时候会产生无法预知的编码错误。建议用:encodeURIComponent(stringvalue)和decodeURIComponent(stringvalue)
附上javascript的三对编码解码的函数的介绍,附件是Java实现的escape(stringvalue) 和unescape(stringvalue)。
encodeURIComponent(stringvalue)方法
将文本字符串编码为一个统一资源标识符 (URI) 的一个有效组件。
function encodeURIComponent(stringvalue):String
必选:stringvalue参数代表一个已编码的 URI 组件。
说明:
encodeURIComponen()方法返回一个已编码的 URI。encodeURIComponent方法对所有的字符编码,请注意,如果该字符串代表一个路径,例如:“/淘宝/index.html”编码后:“%2F%E6%B7%98%E5%AE%9D%2Findex.html”,其中的斜杠也将被编码。这样一来,当该编码结果被作为请求发送到 web 服务器时将是无效的。如果字符串中包含不止一个 URI 组件,请使用encodeURI方法进行编码。
encodeURI(stringvalue)方法
返回编码为有效的统一资源标识符 (URI) 的字符串。
function encodeURI(stringvalue: String) : String
参数
Stringvalue
必选:表示编码 URI 的字符串。
说明:
encodeURI 方法返回一个已编码的 URI。如果将编码结果传递给 decodeURI,则将返回初始的字符串。encodeURI 不对下列字符进行编码:“:”、“/”、“;”和“?”。请使用 encodeURIComponent 对这些字符进行编码。例如:“/淘宝/index.html”编码后是:“/%E6%B7%98%E5%AE%9D/default.html”。
URL最好自己拼接,用encodeURIComponent(stringvalue)编码
escape(stringvalue) 方法
返回一个可在所有计算机上读取的编码 String 对象。
function escape(stringvalue: String) : String
参数
stringvalue
必选。要编码的任何 String 对象或文本。
说明:
escape(strinvalue) 方法返回一个包含 stringvalue内容的字符串值(Unicode 格式)。所有空格、标点、重音符号以及任何其他非 ASCII 字符都用 %xx 编码替换,其中 xx 等于表示该字符的十六进制数。例如,空格编码为“%20”, “/淘宝/index.html”编码为“/%u6DD8%u5B9D/default.html”。
字符值大于 255 的字符以 %uxxxx 格式存储。
注意:escape 方法不能用来对“统一资源标识符”(URI) 进行编码。对其编码应使用 encodeURI 和 encodeURIComponent 方法。
decodeURI(stringvalue) 方法
返回一个已编码的统一资源标识符 (URI) 的非编码形式。
function decodeURI(stringvalue: String) : String
参数
stringvalue
必选。表示编码 URI 的字符串。
说明
decodeURI(stringvalue) 方法返回一个非编码形式字符串值,和encodeURI(strinvalue)相对应。如果strinvalue无效,将发生 URIError。
decodeURIComponent(strinvalue) 方法
返回统一资源标识符 (URI) 的一个已编码组件的非编码形式。
function decodeURIComponent(stringvalue : String) : String
必选的strinvalue参数是一个表示已编码的 URI 组件的值。
说明:
stringvalue是一个完整的 URI 的一部分,这个方法和encodeURIComponent(stringvalue)方法对应。如果 strinvalue无效,则将产生 URIError。
unescape (stringvalue) 方法
返回一个已编码的统一资源标识符 (URI) 的非编码形式。
function unescape (stringvalue: String) : String
参数
stringvalue
必选。表示编码 URI 的字符串。
说明
unescape(stringvalue) 方法返回一个非编码形式字符串值,和escape (strinvalue)相对应。