博客首页 注册 建议与交流 排行榜 加入友情链接         宝宝相册的专门空间
推荐 投诉 搜索: 帮助
隐藏
yexin218.cublog.cn
Java/J2EE中文问题终极解决之道[转载]
最古老的解决方案是使用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的源码。
  在JSP头部声明:
<%@ page contentType="text/html;charset= UTF-8" %>
  在Jsp的html代码中,声明UTF-8:
<META http-equiv="Content-Type" CONTET="text/html; charset=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的第一个拦路虎,也避免因为采取一些临时解决方案,导致中文问题一直出现在新的技术架构中。

 原文地址 http://www.1-100.org/other/11547.htm
发表于: 2006-11-21,修改于: 2006-11-21 11:34,已浏览1935次,有评论2条 推荐 投诉
网友: 本站网友 时间:2006-11-30 12:18:26 IP地址:202.175.104.★
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name | Value |
+--------------------------+----------------------------+
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+
7 rows in set (0.00 sec)

网友: 本站网友 时间:2006-11-30 12:29:39 IP地址:202.175.104.★
mysql中文乱码问题解决一法 
关键字:mysql 中文 乱码 tomcat5.0 java jsp   

在用tomcat,mysql,java,开发web应用的过程中,mysql中文问题一直困扰我,之前开发的一个web应用,瞎猫撞到死耗子,写入和读出都解决(使用的是我下面列举的方法3),然而最近开发的web应用又出现了mysql的中文乱码问题,困扰我将近2个多月,在这期间看了很多关于mysql乱码问题的解决方法,大概有以下的解决方法

1.将所有的编码全部改变为iso8859-1.
2.修改mysql源码重新编译
3.数据库和web页编码混用,但是通过转换解决编码问题,从数据库到web,latin1->gb2312,从web写入数据库,gb2312->latin1

java在使用mysql开发web应用的过程中涉及到编码配置的有以下几个方面:
1.mysql启动时的字符集,在myini文件中配置 default-character-set=字符集 ,放在,[WinMySQLadmin]之上;
2.数据库建表的过程中设置字符集,在CREATE语句最后的 CHARSET=字符集 语句中设置;
3.在驱动url中的选项中设置字符集,jdbc:mysql://localhost:3306/test?useUnicode=true&characterEncoding=字符集;
4.在web显示页中设置显示的字符集,
<%@ page contentType="text/html; charset=字符集" language="java" import="java.sql.*" errorPage="" %>
<meta http-equiv="Content-Type" content="text/html; charset="字符集" >
在servelt中则是response.setContentType("text/html;charset=字符集";
5.如果有更新操作在request.getParameter("参数";获取中文字符的时候涉及到的字符编码问题.

这五个方面构成了mysql中的中文编码比较混乱的局面,一个环节没有处理得当就容易出现中文的乱码问题.

我最终解决的方法只是将1,2,3,4,5的字符集设置为gbk,插入数据前将所有不能正常显示的中文数据转换为gbk.取数据就不用再进行转换了,因为取出和显示的编码全都是gbk,所以可以正常显示.

我的乱码之路——JSP与MySQL交互的中文乱码解决方案及总结 
JSP教程-Java技巧及代码

     首先实现了一个StringConvert bean(GBtoISO()和ISOtoGB()两个方法),解决了与MySQL数据库交互的时候的部分中文乱码问题:在JSP程序中读取MySQL的中文内容,用这两个方法可以解决乱码问题。

    但是从JSP写入到MySQL的中文内容都成了乱码,并且再读出来的时候也显示为“??”,在这里应该出现了编码转换过程中的字符信息丢失。郁闷的是,我在命令行窗口中登陆到MySQL后,执行如“INSERT INTO customerVALUES('字符',...)”这样的语句时,写入到数据表中的中文内容又是显示正常的!!!数据库使用的字符集是utf8。

     碰壁多次,终于发现一条解决问题的路径:查看MySQL手册的时候,看到一条这样的语句:Toallow multiple character sets to be sent from the client, the "UTF-8"encoding should be used, either by configuring "utf8" as the defaultserver character set, or by configuring the JDBC driver to use "UTF-8"through the characterEncoding property.

     此外,在查阅《MySQL权威指南》时,发现在查询语句中可以使用这样的语法将字符串转换到一个给定的字符集:_charset str。

     其中charset必须是服务器支持的某个字符集。在本例中,shopdb数据库使用的默认字符集是utf8,于是开始测试:

     先输入INSERT INTO publish Values('8',_gb2312 '高等教育出版社')  写入后中文变成“??”

     再试INSERT INTO publish Values('8',_gbk '高等教育出版社') 结果同上

     INSERT INTO publish Values('8',_utf8 '高等教育出版社') 这下更干脆,什么都没有!!

       快疯了!!没办法,用show character set;命令查看MySQL支持的字符集,心想我都试一遍总有一个能成功吧。浏览了一下,发现没有几个熟悉的字符集,就只剩下一个latin1(ISO-8859-1)比较常见了,不会是它吧,一试之下果然便是。

     INSERT INTO publish Values('8',_latin1 '高等教育出版社') 输入中文能够正确显示。

       这下总算找到方法了,把Tomcat下配置的数据库连接池的url改为"...characterEncoding=UTF-8",然后把写入数据库的中文内容用

     String s2 = new String(s1.getBytes("gb2312","ISO-8859-1"进行转码,其中s1为中文字符串.然后再写入到数据库一切显示正常。

       为解决这个问题查看了n多资料,现作一个总结:由于字符集和字符编码方式的不同,在OS以及程序之间传递数据(尤其是multiple character sets中的数据)时便会产生乱码以及字符信息的丢失.解决这个问题的关键便是了解数据输出端和接收端使用的字符集和字符编码方式,如果这两种编码方式不同,便需要在数据出口或入口处进行 转码。一般的说,在编写代码,编译,以及运行期间都会字符数据的传递,因此需要特别小心。

      在编写代码的时候,你可能会使用某种开发工具,例如我正在使用的Eclipse.或许在写的时候一切正常,可是一旦保存后再次打开文档,所有的中文字符都变成了乱码。这是因为在编写的时候,这些字符数据都在内存的某个stream中,ok,这没问题,可是保存的时候这个stream中的数据会被写入到硬盘,使用的就是你的开发工具默认的编码方式,如果很不幸你的开发工具默认编码方式是ISO-8859-1,中文字符信息就不能正确地存储。Eclipse中可以这样查看并修改默认字符编码方式:Project->Properties->info,这里有"default     encoding for text file"。如果设置为GBK,那么编写代码并保存这关就过了。

      对于JSP程序而言,编写完代码后就交给Container,首先它们会被转成.java文件,然后编译成.class才能提交给服务器执行.这个过程也存在字符编码问题.java编译器(javac)使用操作系统的语言环境作为默认的字符编码方式,JRE(Java Runtime Environment)也是这样。只有当编译和运行环境的字符编码方式与存储源文件的编码方式相同时,中文字符才能正确地显示。否则就需要在运行时进行转码,使它们使用兼容的编码。这里的设置可以分为几个层次:操作系统层支持的语言,这是最重要的,因为它会影响JVM的默认字符编码方式,同时对字符的显示,如字体等有直接影响;J2EE服务器层,大多数服务器都可以对字符编码进行自定义的配置,例如Tomcat就可以通过web.xml中设置javaEncoding参数设置字符编码,默认是UTF-8.

     IE也可以设置成总是使用UTF-8编码来发送请求.应用程序层,每个配置在服务器下的程序都可以设置自己的编码方式,这个我目前还没有用到,以后再学习。

      运行时的转码,运行时期,应用程序很可能需要与外部系统进行交互,例如对数据库进行读写,对外部文件进行读写.在这些情况下,应用程序免不了要和外部系统进行数据交换。那么对于中文字符, 数据出入口的编码方式就显得特别重要了。一般外部系统都有自己的字符编码方式,我的例子中配置的MySQL就是使用的UTF-8编码。JSP页面通过设定"charset=gb2312",

    使用gb2312编码,在它与数据库交互的时候就需要进行显式的转码才能正确处理中文字符。

MySQL支持UTF-8编码全攻略

最近看到好多关于MySql支持utf-8编码的问题,刚好自己也要用,去找了一下,没有写的很全面的。
整理了一下,供大家参考。

在一下服务器设置测试通过
服务器配置:
    window2000
    Tomcat 4.1,5.19
    Mysql 4.1, 5.0
    Java语言,JDK1.4.2
    数据库驱动mysql-connector-java-3.0.10-stable-bin.jar
    Struts1.1
    
开始前先看提示
MySQL数据库的4.1是一个分水岭,4.1直接支持Unicode,以下版本支持的不好; 

MySQL JDBC Driver的3.0.16也是一个分水岭,3.0.16版本会取数据库本身的编码,然后按照该编码转换,这种方式和Oracle的JDBC Driver是一样的。例如你的数据库是GBK编码的话,JDBC Driver就会把数据库里面的取出来的字符串按照GBK往unicode转换,送给JVM。因此正确的设置数据库本身的编码就尤为重要。 

MySQL JDBC Driver3.0.16以下的版本则不然,它不会那么智能的根据数据库编码来确定如何转换,它总是默认使用ISO8859-1,因此你必须使用 characterEncoding=GBK来强制他把数据库中取出来的字符串按照GBK来往unicode转换。 

因此,使用什么数据库版本,不管是3.x,还是4.0.x还是4.1.x,其实对我们来说不重要,重要的有二: 

1) 正确的设定数据库编码,MySQL4.0以下版本的字符集总是默认ISO8859-1,MySQL4.1在安装的时候会让你选择。如果你准备使用UTF- 8,那么在创建数据库的时候就要指定好UTF-8(创建好以后也可以改,4.1以上版本还可以单独指定表的字符集) 

2) 使用3.0.16以上版本的JDBC Driver,那么你就不需要再写什么characterEncoding=UTF-8

开始设置:
1.打开WinMysqlAdmin管理器,选择my.ini设置项,在[mysql]段加入一下代码
  default-character-set=utf8
  设置后重新启动MySQL服务。
  再打开 WinMysqlAdmin管理器,选择Variables项,查看一下变量的值是否如下
  character_set_server  = utf8
  character_set_system  = utf8
  character_set_database  = utf8
  character_set_client  = utf8
  character_set_connection  = utf8
  character_set_results = utf8
  
  collation_connection = utf8_general_ci
  collation_database = utf8_general_ci
  collation_server = utf8_general_ci
  
  如果不能重启Mysql服务,则可能拼写错误,检查一下
  以上变量的值都符合,恭喜你,设置成功

2.Java中调用数据库连接方法如下
  jdbc:mysql://192.168.1.87/mytest?useUnicode=true&characterEncoding=utf8
  
  如果驱动使用3.0.16以上版本的JDBC Driver,那么你就不需要再写什么characterEncoding=UTF-8
  
3.在页面提交数据处理请看 "中文问题","struts国际化问题"——终极解决方案 一文,非常清楚

4.完成以上三步,你的系统就可以运行与UTF-8编码环境了。


给我留言
版权所有 ChinaUnix.net 页面生成时间:0.15402