注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

网易杭研后台技术中心的博客

 
 
 
 
 

日志

 
 

java web开发中乱码问题总结  

来自yfkscu@126   2013-06-25 19:23:09|  分类: 默认分类 |举报 |字号 订阅

  下载LOFTER 我的照片书  |
在web开发中,我们经常会遇到中文乱码:
1. jsp页面中文显示乱码
2. get请求参数中文乱码
3. post请求参数中文乱码
4. tomcat中Connector组件中URIEncoding和useBodyEncodingForURI参数设置

下面就针对这几种乱码进行原因分析并给出解决方法。
1. jsp页面中文显示乱码
与jsp编码相关的有:jsp源文件的编码、java编译器编译源文件的编码、浏览器显示编码
这三个阶段的编码如果不一致就会出现jsp页面中文乱码问题。
jsp源文件的编码:你编写这个文件所使用的编码方式
java编译器编码:制定java编译器以什么样的编码方式来编译源文件
浏览器显示编码:制定浏览器显示html文件的编码方式

那如何控制这三个阶段的编码呢?
1)jsp源文件编码,也就是我们使用的编辑工具需要制定内容编码,比如中文我们可以使用gbk或者utf-8编码方式
2)java编译器编码,我们可以制定pageEncoding这个参数,例如可以制定pageEncoding="utf-8"(类似于执行javac -encoding=utf-8 xxx.java),这将告诉java编译器已utf-8的方式去编译这个jsp文件。此时如果源文件编码不是utf-8,那么编译成的字节码文件中的中文字符就是乱码了,此后的中文显示也都将是乱码了,因为中文字符的信息在class文件中已经是乱码了。
3)浏览器显示编码:contentType="text/html;charset=iso-8859-1"这个参数告诉浏览器已拉丁编码方式解析文件,如果pageEncoding="utf-8"则保证了编译后的class文件中存储的中文字符都是以utf-8编码存储的,那么浏览器却认为它是拉丁编码的,自然解析出来的页面也就是乱码了。

所以综上所述:这三个阶段的编码必须保证一致,最好都明确指出。
如:<%@ page language="java" pageEncoding="utf-8" contentType="text/html;charset=utf-8"%>
告诉java编译器以utf-8编码方式编译源文件,告诉浏览器以utf-8编码方式解析页面,当然你需要保证源文件的编码方式也是utf-8
pangeEncoding和contentType也可以只指定一个;如果只指定其中一个则默认另一个的编码与指定的那个相同。
如:<%@ page language="java" pageEncoding="utf-8"%>
表示java编译器以utf-8方式编译源文件,并且浏览器以utf-8编码解析页面
<%@ page language="java" contentType="text/html;charset=utf-8"%>
效果同上。

2.get请求参数中文乱码
以tomcat服务器为例说明
get请求参数编码和解码过程:
1)首先非ASCII码字符发送到tomcat服务器之前会被浏览器进行url编码(不同浏览器有不同的编码方式)
2)编码之后的请求链接都是ASCII码字符了,然后浏览器以iso-8859-1的编码方式转换成二进制随着请求头一起发送出去
3)tomcat收到请求后会以ISO-8859-1的编码方式解析get请求,解析出来的参数封装到HttpServletRequest中
4)此时如果我们知道了get请求的url编码方式,就可以进行正确的解码了
例如发送:http://localhost:8080/?Action=TestAction&Name="天涯"
假设url编码方式为utf-8
url编码后的请求的url为:
http://localhost:8080/?Action=TestAction&Name="%e5%a4%a9%e6%b6%af"  
获取Name参数的方法:String name = new String(request.getParamenter("Name").getBytes("ISO-8859-1"), "UTF-8") 
首先获取参数Name的二进制内容,然后以utf-8的编码方式进行解码
综上所述:get请求的编码是比较难控制的,因为我们不能确定浏览器的编码方式,自然在servlet中解码的时候也不能确定解码方式。所以如果参数有中文,我们发送get请求之前最好先用规定好的编码进行一次url编码,这样我们在解码的时候可以确定解码方案。
3. post请求中文乱码
1). jsp中post表单的编码由pageEncoding和contentType参数觉得,以pageEncoding为准,如果没有pageEncoding则以contentType为准,如果没有contentType则以ISO-8859-1编码
2). 在servlet中接受post参数之前需要setCharacterEncoding("utf-8")设置解码方式(这里以utf-8),为例如果没有设置解码格式则使用默认的ISO-8859-1解码。
如果编码和解码格式不一致,则会导致post表单中的中文解析出来的是乱码。

4. URIEncoding和useBodyEncodingForURI参数设置
URIEncoding:This specifies the character encoding used to decode the URI bytes, after %xx decoding the URL. If not specified, ISO-8859-1 will be used.
这个参数指定解析客户端get请求的uri编码。如果不指定默认解码方式为ISO-8859-1。
比如:客户端请求为 http://www.baidu.com?wd=你好, 
浏览器使用utf-8编码后的请求为http://www.baidu.com?wd=%e4%bd%a0%e5%a5%bd
如果uri指定了utf-8编码,则服务器可以正确的解析uri信息;否则解析出的是乱码。所以uri编码格式需要与客户端编码方式相同,解析才不会出错。

useBodyEncodingForURI: This specifies if the encoding specified in contentType should be used for URI query parameters, instead of using the URIEncoding. This setting is present for compatibility with Tomcat 4.1.x, where the encoding specified in the contentType, or explicitly set using Request.setCharacterEncoding method was also used for the parameters from the URL. The default value is false.
useBodyEncodingForURI参数为true时:
1、将使用contentType指定的编码进行URL query中参数的decode;
2、会使URIEncoding参数失效;
3、Request.setCharacterEncoding此时对get请求生效。
不设置时默认值为false

总上所述,一个tomcat应用中为了减少编码问题,尽量保证前端编码、服务器端编码和数据库编码一致。
  评论这张
 
阅读(422)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017