Java中文问题一直困扰着很多初学者,如果了解了Java系统的中文问题原理,我们就可以对中文问题能够采取根本的解决之道。
最古老的解决方案是使用String的字节码转换,这种方案问题是不方便,我们需要破坏对象封装性,进行字节码转换。
还有一种方式是对J2EE容器进行编码设置,如果J2EE应用系统脱离该容器,则会发生乱码,而且指定容器配置不符合J2EE应用和容器分离的原则。
在Java内部运算中,涉及到的所有字符串都会被转化为UTF-8编码来进行运算。那么,在被Java转化之前,字符串是什么样的字符集? Java总是根据操作系统的默认编码字符集来决定字符串的初始编码,而且Java系统的输入和输出的都是采取操作系统的默认编码。
因此,如果能统一Java系统的输入、输出和操作系统3者的编码字符集合,将能够使Java系统正确处理和显示汉字。这是处理Java系统汉字的一个原则,但是在实际项目中,能够正确抓住和控制住Java系统的输入和输出部分是比较难的。J2EE中,由于涉及到外部浏览器和数据库等,所以中文问题乱码显得非常突出。
J2EE应用程序是运行在J2EE容器中。在这个系统中,输入途径有很多种:一种是通过页面表单打包成请求(request)发往服务器的;第二种是通过数据库读入;还有第3种输入比较复杂,JSP在第一次运行时总是被编译成Servlet,JSP中常常包含中文字符,那么编译使用javac时,Java将根据默认的操作系统编码作为初始编码。除非特别指定,如在Jbuilder/eclipse中可以指定默认的字符集。
输出途径也有几种:第一种是JSP页面的输出。由于JSP页面已经被编译成Servlet,那么在输出时,也将根据操作系统的默认编码来选择输出编码,除非指定输出编码方式;还有输出途径是数据库,将字符串输出到数据库。
由此看来,一个J2EE系统的输入输出是非常复杂,而且是动态变化的,而Java是跨平台运行的,在实际编译和运行中,都可能涉及到不同的操作系统,如果任由Java自由根据操作系统来决定输入输出的编码字符集,这将不可控制地出现乱码。
正是由于Java的跨平台特性,使得字符集问题必须由具体系统来统一解决,所以在一个Java应用系统中,解决中文乱码的根本办法是明确指定整个应用系统统一字符集。
指定统一字符集时,到底是指定ISO8859_1 、GBK还是UTF-8呢?
(1)如统一指定为ISO8859_1,因为目前大多数软件都是西方人编制的,他们默认的字符集就是ISO8859_1,包括操作系统Linux和数据库MySQL等。这样,如果指定Jive统一编码为ISO8859_1,那么就有下面3个环节必须把握:
开发和编译代码时指定字符集为ISO8859_1。
运行操作系统的默认编码必须是ISO8859_1,如Linux。
在JSP头部声明:
<%@ page contentType="text/html;charset=ISO8859_1" %>。
(2)如果统一指定为GBK中文字符集,上述3个环节同样需要做到,不同的是只能运行在默认编码为GBK的操作系统,如中文Windows。
统一编码为ISO8859_1和GBK虽然带来编制代码的方便,但是各自只能在相应的操作系统上运行。但是也破坏了Java跨平台运行的优越性,只在一定范围内行得通。例如,为了使得GBK编码在linux上运行,设置Linux编码为GBK。
那么有没有一种除了应用系统以外不需要进行任何附加设置的中文编码根本解决方案呢?
将Java/J2EE系统的统一编码定义为UTF-8。UTF-8编码是一种兼容所有语言的编码方式,惟一比较麻烦的就是要找到应用系统的所有出入口,然后使用UTF-8去“结扎”它。
一个J2EE应用系统需要做下列几步工作:
开发和编译代码时指定字符集为UTF-8。JBuilder和Eclipse都可以在项目属性中设置。
使用过滤器,如果所有请求都经过一个Servlet控制分配器,那么使用Servlet的filter执行语句,将所有来自浏览器的请求(request)转换为UTF-8,因为浏览器发过来的请求包根据浏览器所在的操作系统编码,可能是各种形式编码。关键一句:
request.setCharacterEncoding("UTF-8")。
网上有此filter的源码,Jdon框架源码中com.jdon.util.SetCharacterEncodingFilter
需要配置web.xml 激活该Filter。
在JSP头部声明:
<%@ page contentType="text/html;charset= UTF-8" %>。
在Jsp的html代码中,声明UTF-8:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
设定数据库连接方式是UTF-8。例如连接MYSQL时配置URL如下:
jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
注意,上述写法是JBoss的mysql-ds.xml写法,多亏网友提示,在tomcat中&要写成&即可。一般其他数据库都可以通过管理设置设定UTF-8
其他和外界交互时能够设定编码时就设定UTF-8,例如读取文件,操作XML等。
笔者以前在Jsp/Servlet时就采取这个原则,后来使用Struts、Tapestry、EJB、Hibernate、Jdon等框架时,从未被乱码困扰过,可以说适合各种架构。希望本方案供更多初学者分享,减少Java/J2EE的第一个拦路虎,也避免因为采取一些临时解决方案,导致中文问题一直出现在新的技术架构中。
分享到:
相关推荐
### Java-J2EE中文问题终极解决之道 #### 一、问题背景与挑战 在Java及J2EE领域中,中文支持一直是开发者面临的一大难题。尤其是对于那些初学者来说,中文字符的正确显示与处理往往成为项目的绊脚石。本文旨在探讨...
### J2EE中文乱码问题终极解决之道 在开发基于J2EE的应用系统时,中文乱码问题是开发者经常遇到的一个难题。本篇文章旨在提供一种全面、深入的解决方案,帮助开发者彻底解决这一问题。 #### 一、理解编码机制 在...
尽管上述方法可以在一定程度上解决乱码问题,但最好的解决之道是建立一个完整的编码管理策略,涵盖应用的输入、输出以及中间处理的各个环节。在设计阶段就考虑到字符集的兼容性,避免在后期修复导致的复杂性。同时,...
**2.3 Java/J2EE中文问题终极解决之道** - **中文支持** - 处理 Java 应用程序中的中文问题。 **2.4 Java Web应用中的任务调度** - **任务调度** - 使用定时器或计划任务来执行周期性任务。 **2.5 用连接池...
本资料集合涵盖了J2EE(Java 2 Platform, Enterprise Edition)开发中的多个重要技术领域,旨在为开发者提供全面的参考资料。J2EE是一个用于构建企业级分布式应用的平台,它提供了多种服务和框架,使得开发人员能够...
在探讨J2EE的基础知识时,首先需要了解Java语言中的异常处理机制。Java的异常处理是用于处理程序运行时发生的错误的一种机制。当程序违反了Java的语义规则时,虚拟机就会抛出一个异常。这些规则可以分为两大类:一类...
在软件开发领域,Java凭借其跨平台性、安全性以及丰富的类库支持,成为了最受欢迎的编程语言之一。本文将介绍十五种常用的Java开发工具及其简单的工作环境概述。 #### 1. JDK (Java Development Kit) JDK是Java的...
- EasyJF开源系统安装问题终极解决之EasyDBO错误篇:l/bbs/20210427/4968819-67633142.htm?ejid=2633275163824738 - EasyDBO配置文件easyjf-dbo.xml具体说明:l/20210427/31970563-6771387....
内容有。css2中文手册,DHTML HTML,JAVASCRIPT教程,jscript语言参考,sql语言参考,xml指南,终极配色手册, Hibernate j2ee-egb,javascript对象与数组,正则表达式,jsp语法,mysql oracle9i
里面有高手详细介绍从Java基本语法到J2EE终极之路应该怎么走。呵呵,这是我认为的好东西。特别是自学者,加油 !加油 !加油 !加油 !加油 !加油 !加油 !加油 !加油 !加油 !加油 !加油 !加油 !加油 !加油 !加油 !加油 !...
在IT领域,特别是针对企业级应用服务器的选择与配置,Oracle...而WebLogic Suite则为那些寻求全面解决方案的大企业提供了终极选择。每种版本都有其独特的定位和优势,企业应根据自身业务需求和技术架构来做出最佳选择。
- 是多本书籍的合著者,包括《Beginning Java Databases》和《Beginning J2EE 1.4》。 - 担任过 Dave Johnson 的书籍《Robot Invasion: 7 Cool and Easy Robot Projects》的技术编辑。 - **个人兴趣**: - 正在...
- 成就:参与多本技术书籍撰写,如《Beginning Java Databases》、《Beginning J2EE 1.4》等。 - 其他兴趣:攻读计算机科学硕士学位、弹吉他以及学习萨克斯风演奏。 - **Dave Johnson**: - 背景:拥有机械与航空...