`
Krebs
  • 浏览: 3799 次
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

[转载]Java/J2EE中文问题终极解决之道

阅读更多
Java/J2EE中文问题终极解决之道
板桥里人 http://www.jdon.com 2005/06/29

  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&amp;characterEncoding=UTF-8
注意,上述写法是JBoss的mysql-ds.xml写法,多亏网友提示,在tomcat中&amp;要写成&即可。一般其他数据库都可以通过管理设置设定UTF-8
其他和外界交互时能够设定编码时就设定UTF-8,例如读取文件,操作XML等。
     笔者以前在Jsp/Servlet时就采取这个原则,后来使用Struts、Tapestry、EJB、Hibernate、Jdon等框架时,从未被乱码困扰过,可以说适合各种架构。希望本方案供更多初学者分享,减少Java/J2EE的第一个拦路虎,也避免因为采取一些临时解决方案,导致中文问题一直出现在新的技术架构中。
  相关J2EE中文问题解决的源码系统可参考:按这里

  欢迎进入讨论 也欢迎提出例外案例

分享到:
评论
1 楼 Krebs 2006-10-17  
http://fafeng.blogbus.com/logs/2006/08/3062998.html
(深入剖析Java编程中的中文问题及建议最优解决方法)

这篇文章也是讲得比较深刻的。

相关推荐

    Java/J2EE中文问题终极解决之道

    ### Java/J2EE中文问题终极解决之道 在Java/J2EE开发过程中,中文字符编码问题一直是困扰许多开发者尤其是初学者的一大难题。对于此类问题的根本解决方法不仅需要理解Java系统内部如何处理字符编码,还需要掌握一...

    Java/J2EE面试400问 英文版

    本书《Java/J2EE面试400问 英文版》是一本针对Java和Java Enterprise Edition(J2EE)面试问题的英文资料集,由K.Arulkumaran和A.Sivayini编写。该书旨在帮助初、中级Java程序员准备面试,涵盖了Java/J2EE的核心概念...

    Java面试宝典(Java/J2EE Job Interview Companion)

    Java/J2EE Job Interview Companion Have you got the time to read 10 or more books and articles to add value prior to the interview? This book has been written mainly from the perspective of Java/J2EE ...

    Java-J2EE中文问题终极解决之道.doc

    ### Java-J2EE中文问题终极解决之道 #### 一、问题背景与挑战 在Java及J2EE领域中,中文支持一直是开发者面临的一大难题。尤其是对于那些初学者来说,中文字符的正确显示与处理往往成为项目的绊脚石。本文旨在探讨...

    Java/J2EE interview questions

    Java/J2EE interview questions这本书是为准备面试的Java开发者准备的,涵盖了核心概念、设计和编码问题,以及如何应对面试中可能遇到的问题。 核心概念包括Java语言基础,比如Java语言的基本原则、语法、核心库的...

    J2EE中文问题终极解决之道

    ### J2EE中文乱码问题终极解决之道 在开发基于J2EE的应用系统时,中文乱码问题是开发者经常遇到的一个难题。本篇文章旨在提供一种全面、深入的解决方案,帮助开发者彻底解决这一问题。 #### 一、理解编码机制 在...

    java/j2ee简历guide

    An useful guideline for preparing your resume as a java/j2ee programmer.

    A Java/J2EE technical job interview guide - 英文版

    Learn Java/J2EE core concepts and key areas With Java/J2EE Job Interview Companion By K.Arulkumaran & A.Sivayini

    Learn Java/J2EE core concepts and design/coding issues

    根据给定文件的信息,我们可以总结出以下关于Java/J2EE核心概念、设计及编码问题的知识点: ### 一、Java语言基础 Java是一种面向对象的编程语言,它为开发人员提供了一个强大的平台来构建可扩展且可靠的应用程序...

    Java/J2EE在用友NC项目中的应用

    【Java/J2EE在用友NC项目中的应用】 用友NC项目是用友公司的一款旗舰级ERP产品,它充分利用了Java/J2EE技术的优势,实现了跨平台应用,从而在高端ERP市场占据了重要的地位。Java/J2EE的选择是用友公司在1997年做出...

    Java/J2EE1200G视频教程

    1200Gjava/j2EE视频教程,包括java基础视频教程,J2EE视频教程,J2EE项目实战视频,UML视频教程,数据库视频教程,EJB视频教程,SOA视频教程,Jquery和ext教程,Linux视频教程,Hadoop视频教程,网页美工视频教程,...

    Java/J2EE视频教程1200G

    1200Gjava/j2EE视频教程,包括java基础视频教程,J2EE视频教程,J2EE项目实战视频,UML视频教程,数据库视频教程,EJB视频教程,SOA视频教程,Jquery和ext教程,Linux视频教程,Hadoop视频教程,网页美工视频教程,...

    Java/J2EE Job Interview Companion

    《Java/J2EE Job Interview Companion》是一本专为准备Java及J2EE相关职位面试的专业书籍,由K. Arulkumaran撰写,并得到了Craig Malone、Lara D’Albreo和Stuart Watson等技术审稿人的支持。本书旨在帮助读者深入...

    如何才算掌握Java(J2EE篇)

    在IT行业中,Java是一种广泛应用的编程语言,尤其在企业级应用开发领域,J2EE(Java Platform, Enterprise Edition)更是占据了重要地位。很多人认为自己掌握了Java,但往往在实际项目中遇到困难,这通常是因为他们...

    java/j2ee学习资料大全第四部分(共5部分)

    Java和J2EE是IT行业中两个非常重要的概念,它们构成了企业级应用开发的基础。本学习资料大全的第四部分,显然是...通过深入学习和实践,你将能够熟练运用Java和J2EE技术解决复杂的企业级问题,为你的职业生涯增添亮点。

    j2ee中文乱码问题终极解决之道

    尽管上述方法可以在一定程度上解决乱码问题,但最好的解决之道是建立一个完整的编码管理策略,涵盖应用的输入、输出以及中间处理的各个环节。在设计阶段就考虑到字符集的兼容性,避免在后期修复导致的复杂性。同时,...

    java/j2ee学习资料大全第二部分(共5部分)

    Java/J2EE学习资料大全是IT开发者们提升技能的重要资源,尤其对于想要深入理解Java企业级应用开发的人员来说,这些资料无疑是宝贵的财富。第二部分的学习资料可能涵盖多个主题,包括核心Java、J2EE框架、数据库交互...

    java/j2ee学习资料大全第三部分(共5部分)

    8. **面试技巧**:对于Java和J2EE的面试,需要掌握的基本知识点包括集合框架、多线程、设计模式、数据库连接池、网络编程、性能调优等方面的问题。 9. **学习资料**:本压缩包可能包含详细的教程、实战项目案例、...

    张孝祥java/jsp/web/j2ee面试题及技巧

    张孝祥写的一些面试题,包括java,jsp,web,j2ee,javascript,html,等等方面的面试题和技巧,上次去4399笔试竟然基本上都给我在这里看到了。非常不错的一份面试题

Global site tag (gtag.js) - Google Analytics