原文:http://blog.csdn.net/blueheart20/article/details/43766713javascript
引言: 在Restful类的服务设计中,常常会碰到须要在URL地址中使用中文做为的参数的状况,这种状况下,通常都须要正确的设置和编码中文字符信息。乱码问题就此产生了,该如何解决呢?且听本文详细道来。html
1. 问题的引出前端
在Restful的服务设计中,查询某些信息的时候,通常的URL地址设计为: get /basic/service? keyword=历史 , 之类的URL地址。 可是,在实际的开发和使用中,确是有乱码状况的发生,在后台的读取keyword信息为乱码,没法正确读取。java
2. 乱码是如何产生的?ajax
5. 后台如何正确解析中文字符信息?浏览器
进入后台的信息,在通过二次encodeURI()以后,直接读取是没法后去正确的信息的。 须要继续以下处理:服务器
URLDecoder的decode(String str,String ecn)方法有两个参数,第一个参数为待解码的字符串,第二个参数为解码时的对应编码。函数
6. encodeURI, encodeURIComponent, escape测试
escape() 函数可对字符串进行编码,这样就能够在全部的计算机上读取该字符串。
返回值:已编码的 string 的副本。其中某些字符被替换成了十六进制的转义序列。
说明 :该方法不会对 ASCII 字母和数字进行编码,也不会对下面这些 ASCII 标点符号进行编码: - _ . ! ~ * ' ( ) 。其余全部的字符都会被转义序列替换。全部的空格符、标点符号、特殊字符以及其余非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。好比,空格符对应的编码是%20。不会被此方法编码的字符: @ * / +编码
把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '
把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 String(name.getBytes("iso8859-1"),"UTF-8");
注: name为得到的字符串,iso8859-1为项目的默认字符编码,若是为中文编码gbk,gb2312等则不用这一步进行处理.
分析: 通过程序验证,结果可行的。 由此可知,浏览器自己默认的编码方式是iso8859-1的方式,即便使用了encodeURI进行了utf-8编码处理,主要的字符串内容,好比ascii字符和可见字符都仍是基于iso8859-1浏览器自身的字符。缘由就是这些字符在编码上和UTF-8字符串是重合的。而encodeURI之类的转义函数主要解决,特殊字符%,/之类的字符的转义问题。