前言
在这里,所有的乱码问题都是指中文乱码。
request.getParameter(),获取请求参数出现中文乱码
1、问题描述
点击超链接,超链接的请求路径里有请求参数。然后,获取请求参数,获取到的值出现中文乱码。
2、原因分析
点击超链接发出的请求是GET请求,在tomcat服务器里,通过request.getParameter()来获取请求参数时,tomcat默认是采用ISO-8859-1编码格式对中文进行编码的。所以,获取到的请求参数的值,自然就是乱码的。
中文乱码已经产生,也就是说目前的数据/汉字是乱码的,现在不管.jsp文件的字符集是utf-8还是ISO-8859-1,最终在浏览器里显示的都是中文乱码。原因如下,假设.jsp文件的字符集是utf-8,那么只有当数据是用utf-8编码的时候,浏览器页面才显示中文、才不会乱码;假设.jsp文件的字符集是ISO-8859-1,虽然获取的请求参数的值此时也是ISO-8859-1,此时二者字符集一致,但是ISO-8859-1字符集是无法正常显示中文的,所以还是会乱码。
只有获取的数据的值是utf-8编码,同时.jsp文件的字符集也是utf-8编码,这个时候中文才不会乱码。
3、解决方法
对获取到的请求参数的值,重新进行编码。
示例
String title = new String(request.getParameter("title").getBytes("iso-8859-1"),"utf-8");
编码之后的数据的字符集是utf-8,.jsp文件的字符集也是utf-8,中文显示正常。
4、参考
http://wenku.baidu.com/link?url=8XHNr4PqNpTQkI7w_F2oqjz-gDT31nk15TBj0BeMWXRLXZhGxPoPtefJf03GJeLafY8KWdJJvjMpjWdHLBkngnsbYlhHUwqbnoXdVK8oTxW
5、总结
我觉得最关键的问题是,要明白一个汉字是由什么组成的,什么中文/中文乱码啊、各种字符集啊,越听越糊涂,越讲越糊涂。
一个汉字,如果是采用ISO-889-1字符集编码,那么一个汉字由3个字节组成的,例如:龚,由3个十六进制的字节组成(见下面的示例和图片)。
一个汉字,如果是采用utf-8编码的,那么一个汉字仍然是由3个十六进制的字节组成的——但是这个时候每个字节前面多了一个百分号%(见下面的示例和图片)。
示例
function toGIS(){
var url = "index.jsp?id=1&title=强奸&address=policeAddress&lngX=106.284002&latY=38.453978";
url = encodeURI(url); //index.jsp?id=1&title=%E5%BC%BA%E5%A5%B8&address=policeAddress&lngX=106.284002&latY=38.453978
document.getElementById("toGIS").setAttribute("href", url);
document.getElementById("toGIS").click();
}
(说明:发送请求时,请求路径经过js的encodeURL函数进行重新编码,encodeURL()函数是采用utf-8对中文进行编码的)