自从接触Java和JSP以来,就不断与Java的中文乱码问题打交道,现在终于得到了彻底的解决,现将我们的解决心得与大家共享。
一、Java中文问题的由来
Java的内核和class文件是基于unicode的,这使Java程序具有良好的跨平台性,但也带来了一些中文乱码问题的麻烦。原因主要有两方面,Java和JSP文件本身编译时产生的乱码问题和Java程序于其他媒介交互产生的乱码问题。
首先Java(包括JSP)源文件中很可能包含有中文,而Java和JSP源文件的保存方式是基于字节流的,如果Java和JSP编译成 class文件过程中,使用的编码方式与源文件的编码不一致,就会出现乱码。基于这种乱码,建议在Java文件中尽量不要写中文(注释部分不参与编译,写中文没关系),如果必须写的话,尽量手动带参数-ecoding GBK或-ecoding gb2312编译;对于JSP,在文件头加上或基本上就能解决这类乱码问题。
本文要重点讨论的是第二类乱码,即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.xml:
CharacterEncodingFilter
net.vschool.web.CharacterEncodingFilter
encodingGBK
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参数中指定,如如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 );
终于解决了这个乱码问题
分享到:
相关推荐
Java/JSP中文解决方案 本文旨在解决Java/JSP中文解决方案中出现的问题,旨在解决Java程序与其他存储媒介交互时产生的乱码问题。 一、Java中文问题的由来 Java的内核和class文件是基于unicode的,这使Java程序具有...
解决乱码的各种方法总结,包括数据库的解决方案,个人觉得比较详细有使用价值
本模块提供了完善的解决方案,支持多文件上传和下载,使得用户交互更加便捷。 在Java/JSP上传模块中,主要涉及的技术点包括: 1. **文件上传组件**:通常使用Apache的Commons FileUpload库来处理文件上传。该库...
它们提供了高效、可扩展且跨平台的解决方案,特别适合构建企业级的内容管理系统(CMS)。CMS4J_FREE_B070301可能是这个系统的某个版本或者特定构建。 1. **Java技术**: Java是一种面向对象的编程语言,以其“一次...
【基于JAVA/JSP的电子商务系统设计】 在当前全球化和信息技术高速发展的时代,电子商务已经成为企业经营不可或缺的一部分。JAVA和JSP作为流行的开发工具,被广泛应用于电子商务系统的构建,以实现高效、安全的在线...
Struts提供了一套完整的解决方案,包括请求处理、页面跳转、异常处理等,使得开发者能够更有序地组织代码,提高系统的可扩展性和可维护性。 在实现这样的商务网站时,开发者通常会遵循以下步骤: 1. 设计数据库...
综上所述,这个项目展示了JAVA和JSP在企业级应用开发中的应用,结合了强大的数据库管理和Web服务技术,为办公信息管理提供了完整的解决方案。通过Eclipse进行开发,利用JDK1.6编译和执行Java代码,数据存储在SQL ...
java / jsp 技术构建的博客系统,不同于asp、php语言的博客系统,blog4j采用三层架构(展现层、业务层、数据层)、基于WEB 2.0相关技术、且支持分布式集群化部署,有着易扩展、高性能等特性,是中大型博客网站的理想...
2.JFreeChart:Java 图形解决方案(Application/Applet/Servlet/Jsp) 3.JCommon :JFreeReport和JFreeChart的公共类库 4.JFreeDesigner :JFreeReport的报表设计工具 我们可以从jfree官方网站上获取最新版本和...
描述中提到的解决方案是提供了一个压缩包,包含`lib`和`tld`两个文件夹。`lib`文件夹通常用于存放应用所需的JAR(Java Archive)文件,包括JSTL的实现库,如`jstl.jar`和`standard.jar`。`tld`文件夹可能包含了JSTL...
### Java/J2EE中文问题终极解决之道 在Java/J2EE开发过程中,中文字符编码问题一直是困扰许多开发者尤其是初学者的一大难题...希望本文提供的解决方案能够帮助开发者们顺利地解决Java/J2EE项目中的中文字符编码问题。
本文将深入探讨JSP乱码的原因及其解决方案,帮助开发者有效地处理这类问题。 ### 1. JSP乱码的成因 - **字符集设置不一致**:JSP文件、HTML页面、HTTP头、Servlet输出以及数据库存储等环节的字符集设置不一致,...
本文将深入探讨JSP中文乱码的成因以及提供多种解决方案,帮助开发者有效地处理这类问题。 ### 1. 乱码的可能原因 1. **编码设置不一致**:JSP页面、HTTP请求、响应、数据库等环节的字符编码设置不统一,导致字符在...
这是关于java和jsp编程常见到的异常解决方案,是很关键的一个知识!
### Java常见错误及解决方案 #### 1. 类定义未找到错误 `java.lang.NoClassDefFoundError` **原因分析** - **程序调用的JAVA类文件未正确上传:** 当程序试图加载一个不存在或未正确部署的类时,会出现此类错误。 ...
本文将深入探讨“JSP乱码”的多种解决方案,并提供实用的解决策略。 1. **理解字符编码的基本概念** - 字符编码是计算机对文字进行存储和处理的标准,常见的有ASCII、GBK、UTF-8等。 - JSP页面默认使用ISO-8859-1...
8. **JPA和Hibernate**: 数据持久化的解决方案,JSP如何与ORM框架结合进行数据库操作。 9. **Web应用部署**: WAR文件打包,Tomcat等服务器的配置和应用部署。 10. **AJAX与JSP**: 异步JavaScript和XML技术如何与...
内容概要:本文主要介绍了针对高校社团管理问题的一种有效解决方案,即构建一套基于B/S架构的社团管理系统。文中首先分析了目前高校社团管理存在的问题及其产生的背景,指出传统管理模式已不能适应现代社会需求。接...
需求分析是从客户的需求中提取出软件系统能够帮助用户解决的业务问题,而设计方案则是根据需求分析,规划出系统的功能模块,具体的划分如下:编写企业合同管理系统,让其能创建合同、修改合同、删除合同、合同变更...
更推荐的解决方案是使用Filter,全局设置请求的字符编码为UTF-8。创建一个名为`SetCharacterEncodingFilter`的过滤器类,并在`web.xml`中配置,将`encoding`参数设置为"UTF8"。这样,所有的请求都会通过这个过滤器,...