自从接触Java和JSP以来
![](/icons/43261dou.gif)
就不断和Java
![](/icons/43261de.gif)
中文乱码问题打交道
![](/icons/43261dou.gif)
现在终于得到了彻底
![](/icons/43261de.gif)
解决
![](/icons/43261dou.gif)
现将我们
![](/icons/43261de.gif)
解决心得体会和大家共享
![](/icons/43261dou2.gif)
![](/icons/43261yi.gif)
、Java中文问题
![](/icons/43261de.gif)
由来
Java
![](/icons/43261de.gif)
内核和
![](/icons/43261class.gif)
文件是基于unicode
![](/icons/43261de.gif)
![](/icons/43261dou.gif)
这使Java
![](/icons/43261chengxu.gif)
具有良好
![](/icons/43261de.gif)
跨平台性
![](/icons/43261dou.gif)
但也带来了
![](/icons/43261yi.gif)
些中文乱码问题
![](/icons/43261de.gif)
麻烦
![](/icons/43261dou2.gif)
原因主要有两方面
![](/icons/43261dou.gif)
Java和JSP文件本身编译时产生
![](/icons/43261de.gif)
乱码问题和Java
![](/icons/43261chengxu.gif)
于其他媒介交互产生
![](/icons/43261de.gif)
乱码问题
![](/icons/43261dou2.gif)
首先Java(包括JSP)源文件中很可能包含有中文
![](/icons/43261dou.gif)
而Java和JSP源文件
![](/icons/43261de.gif)
保存方式是基于字节流
![](/icons/43261de.gif)
![](/icons/43261dou.gif)
如果Java和JSP编译成
![](/icons/43261class.gif)
文件过程中
![](/icons/43261dou.gif)
使用
![](/icons/43261de.gif)
编码方式和源文件
![](/icons/43261de.gif)
编码不
![](/icons/43261yi.gif)
致
![](/icons/43261dou.gif)
就会出现乱码
![](/icons/43261dou2.gif)
基于这种乱码
![](/icons/43261dou.gif)
建议在Java文件中尽量不要写中文(注释部分不参和编译
![](/icons/43261dou.gif)
写中文没关系)
![](/icons/43261dou.gif)
如果必须写
![](/icons/43261de.gif)
话
![](/icons/43261dou.gif)
尽量手动带参数-ecoding GBK或-ecoding gb2312编译;对于JSP
![](/icons/43261dou.gif)
在文件头加上<%@ page contentType="text/html;char
![](/icons/43261set.gif)
=GBK"%>或<%@ page contentType="text/html;char
![](/icons/43261set.gif)
=gb2312"%>基本上就能解决这类乱码问题
![](/icons/43261dou2.gif)
本文要重点讨论
![](/icons/43261de.gif)
是第 2类乱码
![](/icons/43261dou.gif)
即Java
![](/icons/43261chengxu.gif)
和其他存储媒介交互时产生
![](/icons/43261de.gif)
乱码
![](/icons/43261dou2.gif)
很多存储媒介
![](/icons/43261dou.gif)
如数据库
![](/icons/43261dou.gif)
文件
![](/icons/43261dou.gif)
流等
![](/icons/43261de.gif)
存储方式都是基于字节流
![](/icons/43261de.gif)
![](/icons/43261dou.gif)
Java
![](/icons/43261chengxu.gif)
和这些媒介交互时就会发生
![](/icons/43261zifu.gif)
(char)和字节(
![](/icons/43261byte.gif)
)的间
![](/icons/43261de.gif)
转换
![](/icons/43261dou.gif)
具体情况如下:
从页面form提交数据到java
![](/icons/43261byte.gif)
->char
从java
![](/icons/43261chengxu.gif)
到页面显示 char?>
![](/icons/43261byte.gif)
从数据库到java
![](/icons/43261byte.gif)
?>char
从java
![](/icons/43261chengxu.gif)
到数据库 char?>
![](/icons/43261byte.gif)
从文件到java
![](/icons/43261byte.gif)
->char
从java
![](/icons/43261chengxu.gif)
到文件 char->
![](/icons/43261byte.gif)
从流到java
![](/icons/43261byte.gif)
->char
从java
![](/icons/43261chengxu.gif)
到流 char->
![](/icons/43261byte.gif)
如果在以上转换过程中使用
![](/icons/43261de.gif)
编码方式和字节原有
![](/icons/43261de.gif)
编码不
![](/icons/43261yi.gif)
致
![](/icons/43261dou.gif)
很可能就会出现乱码
![](/icons/43261dou2.gif)
2、解决思路方法
前面已经提到了Java
![](/icons/43261chengxu.gif)
和其他媒介交互时
![](/icons/43261zifu.gif)
和字节
![](/icons/43261de.gif)
转换过程
![](/icons/43261dou.gif)
如果这些转换过程中容易产生乱码
![](/icons/43261dou2.gif)
解决这些乱码问题
![](/icons/43261de.gif)
关键在于确保转换时使用
![](/icons/43261de.gif)
编码方式和字节原有
![](/icons/43261de.gif)
编码方式保持
![](/icons/43261yi.gif)
致
![](/icons/43261dou.gif)
下面分别论述(Java或JSP自身产生
![](/icons/43261de.gif)
乱码请参看第
![](/icons/43261yi.gif)
部分)
![](/icons/43261dou2.gif)
1、JSP和页面参数的间
![](/icons/43261de.gif)
乱码
JSP获取页面参数时
![](/icons/43261yi.gif)
般采用系统默认
![](/icons/43261de.gif)
编码方式
![](/icons/43261dou.gif)
如果页面参数
![](/icons/43261de.gif)
编码类型和系统默认
![](/icons/43261de.gif)
编码类型不
![](/icons/43261yi.gif)
致
![](/icons/43261dou.gif)
很可能就会出现乱码
![](/icons/43261dou2.gif)
解决这类乱码问题
![](/icons/43261de.gif)
基本思路方法是在页面获取参数的前
![](/icons/43261dou.gif)
强制指定request获取参数
![](/icons/43261de.gif)
编码方式:request.
![](/icons/43261set.gif)
CharacterEncoding("GBK")或request.
![](/icons/43261set.gif)
CharacterEncoding("gb2312")
![](/icons/43261dou2.gif)
如果在JSP将变量输出到页面时出现了乱码
![](/icons/43261dou.gif)
可以通过设置response.
![](/icons/43261set.gif)
ContentType("text/html;char
![](/icons/43261set.gif)
=GBK")或response.
![](/icons/43261set.gif)
ContentType("text/html;char
![](/icons/43261set.gif)
=gb2312")解决
![](/icons/43261dou2.gif)
如果不想在每个文件里都写这样两句话
![](/icons/43261dou.gif)
更简洁
![](/icons/43261de.gif)
办法是使用Servlet规范标准中
![](/icons/43261de.gif)
过虑器指定编码
![](/icons/43261dou.gif)
过滤器
![](/icons/43261de.gif)
在web.xml中
![](/icons/43261de.gif)
典型配置和主要代码如下:
web.xml:
CharacterEncodingFilter
net.vschool.web.CharacterEncodingFilter
encoding
GBK
CharacterEncodingFilter
/*
CharacterEncodingFilter.java:
public
![](/icons/43261class.gif)
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.
![](/icons/43261set.gif)
CharacterEncoding(encoding);
response.
![](/icons/43261set.gif)
ContentType("text/html;char
![](/icons/43261set.gif)
="+encoding);
chain.doFilter(request, response);
}
}
2、Java和数据库的间
![](/icons/43261de.gif)
乱码
大部分数据库都支持以unicode编码方式
![](/icons/43261dou.gif)
所以解决Java和数据库的间
![](/icons/43261de.gif)
乱码问题比较明智
![](/icons/43261de.gif)
方式是直接使用unicode编码和数据库交互
![](/icons/43261dou2.gif)
很多数据库驱动自动支持unicode
![](/icons/43261dou.gif)
如Microsoft
![](/icons/43261de.gif)
SQLServer驱动
![](/icons/43261dou2.gif)
其他大部分数据库驱动
![](/icons/43261dou.gif)
可以在驱动
![](/icons/43261de.gif)
url参数中指定
![](/icons/43261dou.gif)
如如mm
![](/icons/43261de.gif)
mysql驱动:jdbc:mysql://localhost/WEBCLDB?useUnicode=true&characterEncoding=GBK
![](/icons/43261dou2.gif)
3、Java和文件/流的间
![](/icons/43261de.gif)
乱码
Java读写文件最常用
![](/icons/43261de.gif)
类是FileInputStream/FileOutputStream和FileReader/FileWriter
![](/icons/43261dou2.gif)
其中FileInputStream和FileOutputStream是基于字节流
![](/icons/43261de.gif)
![](/icons/43261dou.gif)
常用于读写 2进制文件
![](/icons/43261dou2.gif)
读写
![](/icons/43261zifu.gif)
文件建议使用基于
![](/icons/43261zifu.gif)
![](/icons/43261de.gif)
FileReader和FileWriter
![](/icons/43261dou.gif)
省去了字节和
![](/icons/43261zifu.gif)
的间
![](/icons/43261de.gif)
转换
![](/icons/43261dou2.gif)
但这两个类
![](/icons/43261de.gif)
构造
![](/icons/43261hanshu.gif)
默认使用系统
![](/icons/43261de.gif)
编码方式
![](/icons/43261dou.gif)
如果文件内容和系统编码方式不
![](/icons/43261yi.gif)
致
![](/icons/43261dou.gif)
可能会出现乱码
![](/icons/43261dou2.gif)
在这种情况下
![](/icons/43261dou.gif)
建议使用FileReader和FileWriter
![](/icons/43261de.gif)
父类:InputStreamReader/OutputStreamWriter
![](/icons/43261dou.gif)
它们也是基于
![](/icons/43261zifu.gif)
![](/icons/43261de.gif)
![](/icons/43261dou.gif)
但在构造
![](/icons/43261hanshu.gif)
中可以指定编码类型:InputStreamReader(InputStream in, Char
![](/icons/43261set.gif)
cs) 和OutputStreamWriter(OutputStream out, Char
![](/icons/43261set.gif)
cs)
4、其他
上面提到
![](/icons/43261de.gif)
思路方法应该能解决大部分乱码问题
![](/icons/43261dou.gif)
如果在其他地方还出现乱码
![](/icons/43261dou.gif)
可能需要手动修改代码
![](/icons/43261dou2.gif)
解决Java乱码问题
![](/icons/43261de.gif)
关键在于在字节和
![](/icons/43261zifu.gif)
![](/icons/43261de.gif)
转换过程中
![](/icons/43261dou.gif)
你必须知道原来字节或转换后
![](/icons/43261de.gif)
字节
![](/icons/43261de.gif)
编码方式
![](/icons/43261dou.gif)
转换时采用
![](/icons/43261de.gif)
编码必须和这个编码方式保持
![](/icons/43261yi.gif)
致
![](/icons/43261dou2.gif)
我们以前使用Resin服务器
![](/icons/43261dou.gif)
使用smartUpload组件上传文件
![](/icons/43261dou.gif)
上传文件同时传递
![](/icons/43261de.gif)
中文参数获取没有乱码问题
![](/icons/43261dou2.gif)
当在Linux中把Resin设置成服务后
![](/icons/43261dou.gif)
上传文件同时
![](/icons/43261de.gif)
中文参数获取出现了乱码
![](/icons/43261dou2.gif)
这个问题困扰了我们很久
![](/icons/43261dou.gif)
后来我们分析smartUpload组件
![](/icons/43261de.gif)
源文件
![](/icons/43261dou.gif)
![](/icons/43261yinwei.gif)
文件上传采用
![](/icons/43261de.gif)
是字节流
![](/icons/43261de.gif)
方式
![](/icons/43261dou.gif)
里面包含
![](/icons/43261de.gif)
参数名称和值也是字节流
![](/icons/43261de.gif)
方式传递
![](/icons/43261de.gif)
![](/icons/43261dou2.gif)
smartUpload组件读取字节流后再将参数名称和值从字节流中解析出来
![](/icons/43261dou.gif)
问题就出现在smartUpload将字节流转换成
![](/icons/43261zifu.gif)
串时采用了系统默认
![](/icons/43261de.gif)
编码
![](/icons/43261dou.gif)
而将Resin设置成服务后
![](/icons/43261dou.gif)
系统默认
![](/icons/43261de.gif)
编码可能发生了改变
![](/icons/43261dou.gif)
因此出现了乱码
![](/icons/43261dou2.gif)
后来
![](/icons/43261dou.gif)
我们更改了smartUpload
![](/icons/43261de.gif)
源文件
![](/icons/43261dou.gif)
增加了
![](/icons/43261yi.gif)
个属性char
![](/icons/43261set.gif)
和
![](/icons/43261set.gif)
Char
![](/icons/43261set.gif)
(String)思路方法
![](/icons/43261dou.gif)
将upload
![](/icons/43261kh.gif)
思路方法中提取参数语句:
String value =
![](/icons/43261new.gif)
String(m_binArray, m_startData, (m_endData - m_startData) + 1 );
改成了
String value =
![](/icons/43261new.gif)
String(m_binArray, m_startData, (m_endData - m_startData) + 1, char
![](/icons/43261set.gif)
);
终于解决了这个乱码问题
![](/icons/43261dou2.gif)
3、后记
接触Java和JSP已经有
![](/icons/43261yi.gif)
年多了
![](/icons/43261dou.gif)
这
![](/icons/43261yi.gif)
年来最大
![](/icons/43261de.gif)
收获是越来越喜欢上了Java
![](/icons/43261dou.gif)
开始把问题当作乐事去研究
![](/icons/43261dou.gif)
没有了以前
![](/icons/43261de.gif)
恐惧心理
![](/icons/43261dou.gif)
我相信我会继续坚持下去
![](/icons/43261dou2.gif)
这
![](/icons/43261yi.gif)
年来
![](/icons/43261dou.gif)
从网上学习了很多同行
![](/icons/43261de.gif)
宝贵经验
![](/icons/43261dou.gif)
在此表示感谢
![](/icons/43261dou2.gif)
这是我第
![](/icons/43261yi.gif)
篇自己整理总结
![](/icons/43261de.gif)
Java学习心得体会
![](/icons/43261dou.gif)
由于水平有限
![](/icons/43261dou.gif)
本文中偏颇和
![](/icons/43261cuowu.gif)
的处
![](/icons/43261dou.gif)
欢迎指正
![](/icons/43261dou2.gif)
如果对你有些价值
![](/icons/43261dou.gif)
在保留作者信息和文章原始出处
![](/icons/43261de.gif)
前提下可以随处转载
![](/icons/43261dou2.gif)
撰写该文的前已参考了很多有关Java中文问题
![](/icons/43261de.gif)
文章
![](/icons/43261dou.gif)
其中影响比较大
![](/icons/43261de.gif)
有owen1944在“Java研究组织”中发表
![](/icons/43261de.gif)
![](/icons/43261smhl.gif)
这是我们公司整理总结
![](/icons/43261de.gif)
![](/icons/43261yi.gif)
些有关中文乱码问题
![](/icons/43261de.gif)
![](/icons/43261yi.gif)
些解决方案和经验和大家分享!
![](/icons/43261smhr.gif)
等
![](/icons/43261dou2.gif)
本文谈到
![](/icons/43261de.gif)
解决思路方法已应用到“基于网络
![](/icons/43261de.gif)
协作学习系统-WebCL”等项目中
![](/icons/43261dou.gif)
并通过资源绑定
![](/icons/43261de.gif)
方式实现了该平台中文文两个版本
![](/icons/43261de.gif)
即时切换
![](/icons/43261dou2.gif)
Google根据浏览器自动选择语言
![](/icons/43261dou.gif)
![](/icons/43261yi.gif)
个页面同时显示多种语言
![](/icons/43261de.gif)
国际化应用和车东
![](/icons/43261de.gif)
![](/icons/43261smhl.gif)
Java中文处理学习笔记??Hello Unicode
![](/icons/43261smhr.gif)
![](/icons/43261yi.gif)
文引起了我极大
![](/icons/43261de.gif)
兴趣
![](/icons/43261dou.gif)
日后想将继续探讨Java
![](/icons/43261de.gif)
国际化问题
![](/icons/43261dou.gif)
欢迎大家
![](/icons/43261yi.gif)
起讨论
![](/icons/43261dou2.gif)
(责任编辑:包春林)