Chinaunix首页 | 论坛 | 博客
  • 博客访问: 91440
  • 博文数量: 41
  • 博客积分: 1531
  • 博客等级: 上尉
  • 技术积分: 420
  • 用 户 组: 普通用户
  • 注册时间: 2005-05-17 10:15
文章分类

全部博文(41)

文章存档

2014年(2)

2012年(1)

2011年(2)

2008年(9)

2007年(2)

2006年(5)

2005年(20)

分类: IT业界

2014-10-31 23:30:56

本文试图解释下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) |
给主人留下些什么吧!~~