首先实现了一个stringconvert bean(gbtoiso()和isotogb()两个方法),解决了与mysql交互的时候的部分中文乱码问题:在jsp中读取mysql的中文内容,用这两个方法可以解决乱码问题。
但是从jsp写入到mysql的中文内容都成了乱码,并且再读出来的时候也显示为“??”,在这里应该出现了编码转换过程中的信息丢失。郁闷的是,我
在命令行窗口中登陆到mysql后,执行如“insert into customer
values('',...)”这样的语句时,写入到数据表中的中文内容又是显示正常的!!!使用的集是utf8。
碰壁多次,终于发现一条解决问题的路径:查看mysql手册的时候,看到一条这样的语句:to
allow multiple character sets to be sent from the client, the "utf-8"
encoding should be used, either by configuring "utf8" as the default
server 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,首先它们会被转成.,然后编译成.class才能提交给执行.这个过程也存在编码问题.编译器(c)使用操作的语言环境作为默认的编码方式,jre(java runtime environment)也是这样。只有当编译和运行环境的编码方式与存储源的编码方式相同时,中文才能正确地显示。否则就需要在运行时进行转码,使它们使用兼容的编码。这里的设置可以分为几个层次:操作层支持的语言,这是最重要的,因为它会影响jvm的默认编码方式,同时对的显示,如字体等有直接影响;j2ee层,大多数都可以对编码进行自定义的配置,例如tomcat就可以通过web.xml中设置encoding参数设置编码,默认是utf-8.
ie也可以设置成总是使用utf-8编码来发送请求.应用层,每个配置在下的都可以设置自己的编码方式,这个我目前还没有用到,以后再学习。
运行时的转码,运行时期,应用很可能需要与外部进行交互,例如对进行读写,对外部进行读写.在这些情况下,应用免不了要和外部进行数据交换。那么对于中文, 数据出入口的编码方式就显得特别重要了。一般外部都有自己的编码方式,我的例子中配置的mysql就是使用的utf-8编码。jsp页面通过设定"charset=gb2312",
使用gb2312编码,在它与交互的时候就需要进行显式的转码才能正确处理中文。