background image

response.setContentType("text/html;charset="+encoding);
chain.doFilter(request, response);
}

}

2Java

 

与数据库之间的乱码

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

3、Java 与文件/

 

流之间的乱码

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

4

 

、其他

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