Java 中文问题
From 车东: chedong
Java 中文问题
一、Java 中文问题的由来 Java 的内核和 class 文件是基于 unicode 的,这使 Java 程序具有良好的跨平台性,但也带 来了一些中文乱码问题的麻烦。原因主要有两方面,Java 和 JSP 文件本身编译时产生的乱 码问题和 Java 程序于其他媒介交互产生的乱码问题。 首先 Java(包括 JSP)源文件中很可能包含有中文,而 Java 和 JSP 源文件的保存方式是基 于字节流的,如果 Java 和 JSP 编译成 class 文件过程中,使用的编码方式与源文件的编码 不一致,就会出现乱码。基于这种乱码,建议在
Java 文件中尽量不要写中文(注释部分不 参与编译, 写中文没关系) 如果必须写的话, , 尽量手动带参数-ecoding GBK 或-ecoding gb2312 编译;对于 JSP,在文件头加上 <%@ page contentType="text/html;charset=GBK"%> 或<%@ page contentType="text/html;charset=gb2312"%>基本上就能解决这类乱码问题。 本文要重点讨论的是第二类乱码,即 Java 程序与其他存储媒介交互时产生的乱码。很多存 储媒介,如数据库,文件,流等的存储方式都是基于字节流的,Java 程序与这些媒介交互 时就会发生字符(char)与字节(byte)之间的转换,具体情况如下: 从页面 form 提交数据到 java 程序 byte->char 从 java 程序到页面显示 char—>byte 从数据库到 java 程序 byte—>char 从 java 程序到数据库 char—>byte 从文件到 java 程序 byte->char 从 java
程序到文件 char->byte 从流到 java 程序 byte->char 从 java 程序到流 char->byte 如果在以上转换过程中使用的编码方式与字节原有的编码不一致,很可能就会出现乱码。 二、解决方法 前面已经提到了 Java 程序与其他媒介交互时字符和字节的转换过程,如果这些转换过程中 容易产生乱码。 解决这些乱码问题的关键在于确保转换时使用的编码方式与字节原有的编码 方式保持一致,下面分别论述(Java 或 JSP 自身产生的乱码请参看第一部分)。 1、JSP 与页面参数之间的乱码 、 JSP 获取页面参数时一般采用系统默认的编码方式, 如果页面参数的编码类型和系统默认的 编码类型不一致, 很可能就会出现乱码。 解决这类乱码问题的基本方法是在页面获取参数之 前,强制指定 request 获取参数的编码方式:request.setCharacterEncoding("GBK")或 request.setCharacterEncoding("gb2312")。 如果在 JSP 将变量输出到页面时出现了乱码,可以通过设置 response.setContentType("text/html;charset=GBK")或 response.setContentType("text/html;charset=gb2312")解决。
如果不想在每个文件里都写这样两句话,更简洁的办法是使用 Servlet 规范中的过虑器指定 编码,过滤器的在 web.xml 中的典型配置和主要代码如下: web.x
ml:
CharacterEncodingFilter net.vschool.web.CharacterEncodingFilter encoding GBK CharacterEncodingFilter /* CharacterEncodingFilter.java: public class 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.setCharacterEncoding(encoding); response.setContentType("text/html;charset="+encoding); chain.doFilter(request, response); } } 2、Java 与数据库之间的乱码 、 大部分数据库都支持以 unicode 编码方式,所以解决 Java 与数据库之间的乱码问题比较明 智的方式是直接使用 unicode 编码与数据库交互。很多数据库驱动自动支持 unicode,如 Microsoft 的 SQLServer 驱动。其他大部分数据库驱动,可以在驱动的 url 参