论坛首页 Java企业应用论坛

对于java web开发汉字出现乱码的分析

浏览 1871 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2011-03-05   最后修改:2011-03-06
  想哪就说哪啦,有不到位的地方请理解一下,就是自己的日常总结

  浏览器编码参数时用的编码方案: 主要根据jsp页面的pageEncoding参数,可以在页面上右键点击然后选择编码来查看是什么编码
如pageEncoding是gb2312 则汉字: 不是=%B2%BB%CA%C7
gb2312字符集中是以双字节编码的
其中汉字"不"用十六进制表示为0xB2BB
"是"用十六进制表示为0xCAC7 对应在gb2312字符集中的这两个汉字中的数字编码,

如pageEncoding是utf-8 则汉字: 不是=%E4%B8%8D%E6%98%AF
utf-8字符集中是用三个字节表示一个汉字的
其中汉字"不"用十六进制表示为0xE4B88D
"是"用十六进制表示为0xE698AF 对应在utf-8字符集中的这两个汉字中的数字编码,

默认会以ISO-8859-1对汉字编码,如果页面上写的是这个,肯定会乱码

发生请求时 浏览器把参数在对应字符集的编码数字表示形式发送到服务器

若想在服务器端正确定出现汉字,想想要怎么办才行呢
1 首先要清楚知道客户端是以什么编码形式把数据发过来的,我好把发过来的数字在字符集中找到它对应的汉字啊
2 服务器程序以什么样的编码形式对发过来的汉字认识它,就是服务器如何识别发过来的是什么东西,
  如服务器接收到一段数据name=%E4%B8%8D%E6%98%AF 服务器若是以gb2312来认识它的话就是三个汉字0xE4B8 0x8DE6 0x98AF,
  当它在gb2312字符集找这三个对应
  的汉字是什么时,就会找到别的字符啦,这时就会出现你不想看到的数据 “涓??”
  服务器若是以utf-8来认识它的话就是两个汉字0xE4B88D 0xE698AF,当它在utf-8字符集找这两个对应
  的汉字是什么时,就会找到正确的汉字“不是”
 
tomcat处理请求的编码方式

post请求是 tomcat以你设置的  request.setCharacterEncoding("gb2312") 来认识发来的数据,这时只需要确保页面发来数据的编码和这个一样就行了;
get方式和url后面直接跟参数时 会以ISO-8859-1来认识数据  编码成传过来的数字在iso-8859-1中对应的字符,是中文的话都会乱,
这时用 byte[] byte = request.getParameter("us").getBytes("iso-8859-1") 先还原成原来的数字形式(也就是原来的字节顺序)再用你页面的编码用
new String(byte,"gb2312")来重新找到在gb2312字符集对就的字符(用两个字节一组来找) 这样汉字就正确显示了

当使用一些js框架时,用ajax发送请求时框架会对传来的参数(不管是直接跟在url后面的还是以对象形式传来的{name:'不是'})
都会用encodeURIComponent
用utf-8编码方式对参数编码,和上文所说的浏览器编码一样,不过浏览器用你自己指定的来编码,encodeURIComponent默认会用utf-8来编码
所以解决ajax传数据乱码的方式有两个:
1 客户端以utf-8来编码,后台就也用utf-8来解码, request.setCharacterEncoding("utf-8")就可以正常 显示 tomcat什么时候以utf-8解码呢,
   当请求是post时,所有ajax请求方式设为post时不乱
2 对要传的汉字两次编码,一:修改源码,找到发送请求时的编码encodeURIComponent那 对编码后的结果再encodeURIComponent 即
e = encodeURIComponent;result = e(e("不是"));二 或在写ajax时自己把参数先encodeURIComponent一次;,
这样传过去的就是英文字母的编码形式 到tomcat时不管请求是post还是get方式,这时tomcat请会把传来的字节解码成英文形式,而这个
英文形式正是对汉字以utf-8编码后的表示形式,此时再用java.net.Decoder.decoder以utf-8形式解码一下,汉字又重新回来了


只能理解到这了,后台和数据库传递数据时也类似,请各位自己想一下自己的实践过程,可以补充在楼下,有什么不对的地方请指出
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics