专注于互联网--专注于架构

最新标签
网站地图
文章索引
Rss订阅

首页 »Java教程 » java乱码:进阶--对Java/JSP中文乱码问题解决心得体会 »正文

java乱码:进阶--对Java/JSP中文乱码问题解决心得体会

来源: 发布时间:星期四, 2008年12月18日 浏览:51次 评论:0
自从接触Java和JSP以来就不断和Java中文乱码问题打交道现在终于得到了彻底解决现将我们解决心得体会和大家共享

、Java中文问题由来 

Java内核和文件是基于unicode这使Java具有良好跨平台性但也带来了些中文乱码问题麻烦原因主要有两方面Java和JSP文件本身编译时产生乱码问题和Java于其他媒介交互产生乱码问题

首先Java(包括JSP)源文件中很可能包含有中文而Java和JSP源文件保存方式是基于字节流如果Java和JSP编译成文件过程中使用编码方式和源文件编码不就会出现乱码基于这种乱码建议在Java文件中尽量不要写中文(注释部分不参和编译写中文没关系)如果必须写尽量手动带参数-ecoding GBK或-ecoding gb2312编译;对于JSP在文件头加上<%@ page contentType="text/html;char=GBK"%>或<%@ page contentType="text/html;char=gb2312"%>基本上就能解决这类乱码问题

本文要重点讨论是第 2类乱码即Java和其他存储媒介交互时产生乱码很多存储媒介如数据库文件流等存储方式都是基于字节流Java和这些媒介交互时就会发生(char)和字节()的间转换具体情况如下:

从页面form提交数据到java ->char
从java到页面显示 char?>

从数据库到java ?>char
从java到数据库 char?>

从文件到java ->char
从java到文件 char->

从流到java ->char
从java到流 char->

如果在以上转换过程中使用编码方式和字节原有编码不很可能就会出现乱码

2、解决思路方法 

前面已经提到了Java和其他媒介交互时和字节转换过程如果这些转换过程中容易产生乱码解决这些乱码问题关键在于确保转换时使用编码方式和字节原有编码方式保持下面分别论述(Java或JSP自身产生乱码请参看第部分)

1、JSP和页面参数的间乱码 
JSP获取页面参数时般采用系统默认编码方式如果页面参数编码类型和系统默认编码类型不很可能就会出现乱码解决这类乱码问题基本思路方法是在页面获取参数的前强制指定request获取参数编码方式:request.CharacterEncoding("GBK")或request.CharacterEncoding("gb2312")
如果在JSP将变量输出到页面时出现了乱码可以通过设置response.ContentType("text/html;char=GBK")或response.ContentType("text/html;char=gb2312")解决
如果不想在每个文件里都写这样两句话更简洁办法是使用Servlet规范标准中过虑器指定编码过滤器在web.xml中典型配置和主要代码如下:
web.xml:


CharacterEncodingFilter
net.vschool.web.CharacterEncodingFilter
encoding

GBK





CharacterEncodingFilter
/*


CharacterEncodingFilter.java:

public  CharacterEncodingFilter implements Filter 
{

protected String encoding = null; 

public void init(FilterConfig filterConfig) throws ServletException 
{
this.encoding = filterConfig.getInitParameter("encoding");
}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException 
{
request.CharacterEncoding(encoding);
response.ContentType("text/html;char="+encoding);
chain.doFilter(request, response);
}

}


2、Java和数据库的间乱码 
大部分数据库都支持以unicode编码方式所以解决Java和数据库的间乱码问题比较明智方式是直接使用unicode编码和数据库交互很多数据库驱动自动支持unicode如MicrosoftSQLServer驱动其他大部分数据库驱动可以在驱动url参数中指定如如mmmysql驱动:jdbc:mysql://localhost/WEBCLDB?useUnicode=true&characterEncoding=GBK

3、Java和文件/流的间乱码 
Java读写文件最常用类是FileInputStream/FileOutputStream和FileReader/FileWriter其中FileInputStream和FileOutputStream是基于字节流常用于读写 2进制文件读写文件建议使用基于FileReader和FileWriter省去了字节和的间转换但这两个类构造默认使用系统编码方式如果文件内容和系统编码方式不可能会出现乱码在这种情况下建议使用FileReader和FileWriter父类:InputStreamReader/OutputStreamWriter它们也是基于但在构造中可以指定编码类型:InputStreamReader(InputStream in, Char cs) 和OutputStreamWriter(OutputStream out, Char cs) 

4、其他 
上面提到思路方法应该能解决大部分乱码问题如果在其他地方还出现乱码可能需要手动修改代码解决Java乱码问题关键在于在字节和转换过程中你必须知道原来字节或转换后字节编码方式转换时采用编码必须和这个编码方式保持我们以前使用Resin服务器使用smartUpload组件上传文件上传文件同时传递中文参数获取没有乱码问题当在Linux中把Resin设置成服务后上传文件同时中文参数获取出现了乱码这个问题困扰了我们很久后来我们分析smartUpload组件源文件文件上传采用是字节流方式里面包含参数名称和值也是字节流方式传递smartUpload组件读取字节流后再将参数名称和值从字节流中解析出来问题就出现在smartUpload将字节流转换成串时采用了系统默认编码而将Resin设置成服务后系统默认编码可能发生了改变因此出现了乱码后来我们更改了smartUpload源文件增加了个属性charChar(String)思路方法将upload思路方法中提取参数语句:
String value =  String(m_binArray, m_startData, (m_endData - m_startData) + 1 );
改成了
String value =  String(m_binArray, m_startData, (m_endData - m_startData) + 1, char );
终于解决了这个乱码问题

3、后记 
接触Java和JSP已经有年多了年来最大收获是越来越喜欢上了Java开始把问题当作乐事去研究没有了以前恐惧心理我相信我会继续坚持下去年来从网上学习了很多同行宝贵经验在此表示感谢这是我第篇自己整理总结Java学习心得体会由于水平有限本文中偏颇和的处欢迎指正如果对你有些价值在保留作者信息和文章原始出处前提下可以随处转载
撰写该文的前已参考了很多有关Java中文问题文章其中影响比较大有owen1944在“Java研究组织”中发表这是我们公司整理总结些有关中文乱码问题些解决方案和经验和大家分享!本文谈到解决思路方法已应用到“基于网络协作学习系统-WebCL”等项目中并通过资源绑定方式实现了该平台中文文两个版本即时切换Google根据浏览器自动选择语言个页面同时显示多种语言国际化应用和车东Java中文处理学习笔记??Hello Unicode文引起了我极大兴趣日后想将继续探讨Java国际化问题欢迎大家起讨论
           (责任编辑:包春林)







相关文章

读者评论

发表评论

  • 昵称:
  • 内容: