charset=gb2312。
要处理Form中传递的中文参数,应该在JSP中加入下面的代码,另外定义一个专门解决这个问题的
getStr类,然后对接收到的参数进行转换:
String keyword1=request.getParameter(“keyword1”); keyword1=getStr(keyword1);
这样就可以解决问题了,代码如下:
<%@ page contentType=“text/html;charset=gb2312”%> <%!
public String getStr(String str){ try{String temp_p=str;
byte[] temp_t=temp_p.getBytes(“ISO8859-1”); String temp=new String(temp_t); return temp; }
catch(Exception e){ } return “NULL”; } %>
<%--http://www.cndes.com测试--%>
<% String keyword=“创联网络技术中心欢迎您的到来”; String keyword1=request.getParameter(“keyword1”); keyword1=getStr(keyword1); out.print(keyword); out.print(keyword1); %>
另外,流行的关系数据库系统都支持数据库Encoding,也就是说在创建数据库时可以指定它自己的字符
集设置,数据库的数据以指定的编码形式存储。当应用程序访问数据时,在入口和出口处都会有
Encoding 转换。对于中文数据,数据库字符编码的设置应当保证数据的完整性。 GB2312、GBK、
UTF-8 等都是可选的数据库 Encoding,也可以选择 ISO8859-1 (8-bit), 但会增加了编程的复
杂度,ISO8859-1不是推荐的数据库 Encoding。在JSP/Servlet编程时,可以先用数据库管理系统提供
的管理功能检查其中的中文数据是否正确。
(3)JDBC Driver的字符转换
目前大多数JDBC Driver采用本地编码格式来传输中文字符,例如中文字符“0x4175”会被转成“0x41
”和“0x75”进行传输。因此需要对JDBC Driver返回的字符以及要发给JDBC Driver的字符进行转换
。当用JDBC Driver向数据库中插入数据时,需要先将Unicode转成Native code; 当 JDBC Driver
从数据库中查询数据时,则需要将Native code转换成Unicode。下面给出了这两种转换的实现:
String native2Unicode(String s) {
if (s == null || s.length() == 0) { return null; }
byte[] buffer = new byte[s.length()];
for (int i = 0; i s.length(); i++) { if (s.charAt(i)>= 0x100) {
c = s.charAt(i);
byte []buf = (“”+c).getBytes(); buffer[j++] = (char)buf[0]; buffer[j++] = (char)buf[1]; }
else {buffer[j++] = s.charAt(i);} }
return new String(buffer, 0, j); }
要注意的是,有些JDBC Driver如果通过JDBC Driver Manager设置了正确的字符集属性,以上方法
就不需要了。具体情况可参考相关JDBC的资料。 其实理解了,中文乱码就这么一回事!反复使用就会摸出一定的门道了!我觉得以上的三种方法,只要你
真的能弄懂,在遇到中文问题时,在这三种方法多试尝,我保证你不再会使这种中文问题所烦!
以上只是自己的一些经验所谈,如果有什么不对,希望能提出,共同学习! //////////////////////////////////////////////////////////////////////////////////////////
我的乱码之路——JSP与MySQL交互的中文乱码解决方案及总结 首先实现了一个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 \
used, either by configuring \or by configuring
the JDBC driver to use \
此外,在查阅《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(\进行转码,其中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中设置