本文试图解释下jsp乱码背后的原理,希望对大家有所帮助,也希望后来的IT人“能求甚解”。
背景:
倒腾一个web应用,解决jsp获取get参数的乱码问题,查了下百度,没有找到一个比较合理的分析和解析。
大家仅仅是急急忙忙找答案,急急忙忙解决问题,对其中的缘由思考得相对少了些,浮躁的IT!
问题:
在chrome内发送http请求:
%E9%98%BF%E5%B8%83
在tomcat内jsp页面中:
String activeName = request.getParameter("activeName");
打印出来是乱码,何解?
分析:
第1步. tomcat将收到的url编码(什么事URL编码?在百度搜索下吧)参数直接转换成lanti1编码(一般用lanti码表示任意编码的字节流,而tomcat是不知道浏览器所使用的编码格式的,从这一点上看tomcat将字节流专程lanti1编码是合理的),如:%e9对应一个字节,本例中转换成6个字节;
第2步. 然后将latin1编码转换成内部编码string
以上是getParameter的逻辑。
为什么是乱码呢?因为chrome先将参数做url编码,其实我在浏览器地址栏输入的是“阿布”
而“阿”的utf-8编码就是byte[] b = {(byte)0xe9,(byte)0x98,(byte)0xbf};这点可以写个简单的java代码验证。
所以要得到非乱码,需要做如下转换
String activeName = request.getParameter("activeName");
String trueActiveName = new String(activeName.getBytes("Latin1"), "utf-8"); //第一个getBytes还原上述第2步的原始的latin1编码,这是浏览器做url编码前的字节流,chrome浏览器是将我输入的汉字映射到utf-8空间的。所以这个latin1编码流就是utf-8编码流,调用String的构造函数,将utf-8的字节流转换成java内部编码(UTF-16,这个大家可以看看相关基础书籍的介绍)。
是不是解决疑惑了?
阅读(241) | 评论(0) | 转发(0) |