URL地址中的中⽂乱码问题的解决
引⾔:在Restful类的服务设计中,经常会碰到需要在URL地址中使⽤中⽂作为的参数的情况,这种情况下,⼀般都需要正确的设置和编码中⽂字符信息。乱码问题就此产⽣了,该如何解决呢?且听本⽂详细道来。
1.  问题的引出
在Restful的服务设计中,查询某些信息的时候,⼀般的URL地址设计为: get /basic/service? keyword=历史,之类的URL地址。但是,在实际的开发和使⽤中,确是有乱码情况的发⽣,在后台的读取keyword信息为乱码,⽆法正确读取。
2. 乱码是如何产⽣的?
由于我们利⽤URL传递参数这种⽅式是依赖与浏览器环境中的,也就是说URL及URL中包含的各个key=value格式的传递参数键值对参数是在浏览器地址栏中的处理原理处理相应编码后传递⾄后台进⾏解码的。
由于我们没有进⾏任何处理,此时javascript请求URL并传参数存在中⽂时(也就是说输⼊框中输⼊中⽂时),对URL的中⽂参数进⾏编码是按照浏览器机制进⾏编码的。此时编码存在乱码问题。
3. 初次编码, javascript中利⽤encodeURI()⽅法进⾏编码。
url编码处理
利⽤encodeURI()在javascript中对中⽂URL参数进⾏编码时,“测试”⼆字会被转换为“%E6%B5%8B%E8%AF%95”。但是问题依然存在。原因是在编码后的字符串信息,浏览器机制会认为“%”是⼀个转义字符,浏览器会把地址栏URL中的传递的已转换参数“%”与“%”之间的已转义字符进⾏处理传递到后台中。这样会造成与实际经过encodeURI()编码后的URL不符,因为浏览器误认为“%”是转义字符字符了,它并未将“%”认为是个普通字符。
4. ⼆次编码,使⽤encodeURI
操作: encodeURI(encodeURI("/order?name=" + name));
处理后的URL不在是通过⼀次 encodeURI()转换后的字符串”%E6%B5%8B%E8%AF%95“,⽽是经过上⼀步两层encodeURI()处理URL处理后的字符串”%25E6%B255%258B%25E8%AF%2595“,通过再次编码原有被浏览起解析为转义字符的”%“被再次编码,转换成了普通字符转”%25“。
此时前端javascript代码对带有中⽂的URL编码已经完成,并通过URL传递参数的⽅式传递到后台等待处理,Action获取到正常转换切⽆乱码的参数为”%25E6%B255%258B%25E8%AF%2595“,此字符串对应的中⽂正是我们输⼊的”测试“⼆字。
5. 后台如何正确解析中⽂字符信息?
进⼊后台的信息,在经过⼆次encodeURI()之后,直接读取是⽆法后去正确的信息的。需要继续如下处理:
[html]
1. URLDecoder.decode("chinese string","UTF-8")
URLDecoder的decode(String str,String ecn)⽅法有两个参数,第⼀个参数为待解码的字符串,第⼆个参数为解码时的对应编码。
6.  encodeURI, encodeURIComponent, escape
6.1  escape()函数
escape() 函数可对字符串进⾏编码,这样就可以在所有的计算机上读取该字符串。
返回值:已编码的 string 的副本。其中某些字符被替换成了⼗六进制的转义序列。
说明:该⽅法不会对 ASCII 字母和数字进⾏编码,也不会对下⾯这些 ASCII 标点符号进⾏编码: - _ . !
~ * ' ( ) 。其他所有的字符都会被转义序列替换。所有的空格符、标点符号、特殊字符以及其他⾮ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表⾥⾯的编码的16进制数字)。⽐如,空格符对应的编码是%20。不会被此⽅法编码的字符: @ * / +
6.2 encodeURI() ⽅法
把URI字符串采⽤UTF-8编码格式转化成escape格式的字符串。不会被此⽅法编码的字符:! @ # $& * ( ) = : / ; ? + '
6.3  encodeURIComponent() ⽅法
把URI字符串采⽤UTF-8编码格式转化成escape格式的字符串。与encodeURI()相⽐,这个⽅法将对更多的字符进⾏编码,⽐如 / 等字
符。所以如果字符串⾥⾯包含了URI的⼏个部分的话,不能⽤这个⽅法来进⾏编码,否则 / 字符被编码之后URL将显⽰错误。
不会被此⽅法编码的字符:! * ( ) '
因此,对于中⽂字符串来说,如果不希望把字符串编码格式转化成UTF-8格式的(⽐如原页⾯和⽬标
页⾯的charset是⼀致的时候),只需要使⽤escape。如果你的页⾯是GB2312或者其他的编码,⽽接受参数的页⾯是UTF-8编码的,就要采⽤encodeURI或者encodeURIComponent。
7. 另⼀种处理URL的中⽂乱码⽅案
请求端的中字符有encodeURI进⾏⼀次转码,如:
var url="/ajax?name="+encodeURI(name);
服务器端代码:
name=new Bytes("iso8859-1"),"UTF-8");
注: name为获得的字符串,iso8859-1为项⽬的默认字符编码,如果为中⽂编码gbk,gb2312等则不⽤这⼀步进⾏处理.
分析:经过程序验证,结果可⾏的。由此可知,浏览器本⾝默认的编码⽅式是iso8859-1的⽅式,即使使⽤了encodeURI进⾏了utf-8编码处理,主要的字符串内容,⽐如ascii字符和可见字符都还是基于iso8859-1浏览器⾃⾝的字符。原因就是这些字符在编码上和UTF-8字符串是重合的。⽽encodeURI之类的转义函数主要解决,特殊字符%,/之类的字符的转义问题。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。