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

j2ee|解决|问题|中文

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头部声明:。

    (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头部声明:。

    在Jsp的html代码中,声明UTF-8:

    设定数据库连接方式是UTF-8。例如连接MYSQL时配置URL如下:

    jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=UTF-8
    一般数据库都可以通过管理设置设定UTF-8

    其他和外界交互时能够设定编码时就设定UTF-8,例如读取文件,操作XML等。

    笔者以前在Jsp/Servlet时就采取这个原则,后来使用Struts、Tapestry、EJB、Hibernate、Jdon等框架时,从未被乱码困扰过,可以说适合各种架构。希望本方案供更多初学者分享,减少Java/J2EE的第一个拦路虎,也避免因为采取一些临时解决方案,导致中文问题一直出现在新的技术架构中。

时间: 2024-08-23 16:00:47

Java/J2EE中文问题终极解决之道的相关文章

怎样解决Java/J2EE中文问题

大部分程序员在编程中都遇到过Java中文问题,但是只要你知道了Java系统的中文问题原理,我们就可以对中文问题说拜拜. 最古老的解决方案是使用String的字节码转换,这种方案问题是不方便,我们需要破坏对象封装性,进行字节码转换. 还有一种方式是对J2EE容器进行编码设置,如果J2EE应用系统脱离该容器,则会发生乱码,而且指定容器配置不符合J2EE应用和容器分离的原则. 在Java内部运算中,涉及到的所有字符串都会被转化为UTF-8编码来进行运算.那么,在被Java转化之前,字符串是什么样的字符

【技术贴】servlet传参|前台传参含中文符号等 tomcat乱码 java后台接收乱码终极解决方

1.前台传参,一定要编码,否则中文传不出来~~tomcat乱码此篇只适合于tomcat中文传参乱码,websphere6.1中文传参乱码请移步http://hi.baidu.com/ae6623/item/27c43f57e913a0cad2e10c46 前台如果用js进行了编码,后台用jsp或者servlet进行解码的时候就有可能乱码,如下,是我遇到的一个问题. 我的前台js里面写: var descMsg = encodeURIComponent($("#descMsg").val

java页面中文乱码的解决办法_java

在页面提交到tomcat乱码 解决方法是在tomcat/conf/server.xml中进行配置以tomcat6.0.32为例,需将以下代码:Xml代码 复制代码 代码如下: <Connectorport="8080"protocol="HTTP/1.1"connectionTimeout="20000"redirectPort="8443"/><Connector port="8080"

js传值中文乱码:js url传值中文乱码之解决之道

因为js url在传值的过程中使用的是js自己默认的字符集编码规则,我们必须把它转成属于我们自己的编码规格-------------在websphere 中使用的是url=encodeURI(encodeURI(url)); //用了2次encodeURI 测试成功,第一次转换没有尝试,处理方法一.js 程序代码:url=encodeURI(url);注意是整个URL服务器端的代码:String linename = new String(request.getParameter("name&q

js url传值中文乱码之解决之道_javascript技巧

在websphere 中使用的是url=encodeURI(encodeURI(url)); //用了2次encodeURI 测试成功,第一次转换没有尝试, 处理方法一. js 程序代码:url=encodeURI(url);注意是整个URL 服务器端的代码:String linename = new String(request.getParameter("name").getBytes("ISO-8859-1"),"UTF-8"); 处理方法

谢国忠:人民币升值非中美贸易不平衡解决之道

连锁效应 人民币升值并非中美贸易不平衡的终极解决之道 <环球企业家>专栏 谢国忠专栏 近来,美国政府和国会对人民币汇率的指责之声甚嚣尘上.最主要动机还是为了应对国内的就业压力:在即将于今年十一月进行的中期选举中,就业问题肯定是最重要的议题.在野的共和党可以借此指责民主党,而民主党想要把责任推到中国身上,作为政治上的权宜之计,这是意料之中的.尽管现在美国国会通过贸易保护措施的危险越来越大,我还是不相信他们会在年内采取实质性举措.如果国会真通过了某种重大提案,国际股市会重挫,迫使美国国会妥协. 今

java中文乱码解决之道(一)—–认识字符集

java编码中的中文问题是一个老生常谈的问题了,每次遇到中文乱码LZ要么是按照以前的经验修改,要么则是baidu.com来解决问题.阅读许多关于中文乱码的解决办法的博文后,发现对于该问题我们都没有一个清晰明了的认识,于是LZ想通过这系列博文来彻底分析.解决java中文乱码问题,如有错误之处望各位同仁指出!当然,此系列博文并非LZ完全原创,都是在前辈基础上总结,归纳,如果雷同纯属借鉴-- 问题起源 对于计算机而言,它仅认识两个0和1,不管是在内存中还是外部存储设备上,我们所看到的文字.图片.视频等

解决Java J2EE乱码问题的方法_java

乱码是j2ee中一个比较常见的问题.遇到一两个问题的情况下,可以用new String(request.getParameter(xxx).getBytes("ISO-8859-1"),"UTF-8")来解决.遇到多的情况下,就最好用过滤器. 过滤器只需要注意2个地方即可--类和web.xml 1.在web.xml上面的发布如下: <fileter> <!-- 类名 --> <filter-name>SetCharsetEncod

终极解决:iOS 与 Java 服务器之间 SSL 握手失败的解决:Cipher Suites

iOS 与 Java 服务器之间 SSL 握手失败的解决:Cipher Suites 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. 终极解决: ------------------ iOS 与