Win2000
Tomcat4.1.24
Jdk1.4.1_02
Mysql4.0.13
Mysql的Jdbc驱动mm.mysql-2.0.11-bin.jar
出现的问题:
我在写入一条有中文的数据后,查询数据库,出现了乱码。源码如下:
<%@ page contentType="text/html;charset=gb2312" %>
<%@ page import="java.sql.*" %>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<%
try {
Class.forName("org.gjt.mm.mysql.Driver").newInstance();
out.print("111");
}
catch (Exception E) {
out.println("Unable to load driver.");
}
try {
Connection C = DriverManager.getConnection("jdbc:mysql://localhost/book?user=root");
Statement s=C.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,ResultSet.CONCUR_READ_ONLY);
/**从库中读取数据*/
ResultSet rs=s.executeQuery("select * from bookinfo");
while(rs.next())
{
out.print(rs.getString(1));
out.print(rs.getString(2));
out.print(rs.getString(3));
}
rs.close();
/**写数据到库中*/
String s1="笑傲江湖";
s1=new String(s1.getBytes("ISO-8859-1"));
String sql="insert into bookinfo values('000006','"+s1+"','金庸','三联出版社',5,'武侠名著')";
s.executeUpdate(sql);
out.print("插入成功");
s.close();
C.close();
}
catch (SQLException e) {
out.print("Error");
}
%>
</html>
我发现:
0.执行上述语句后"笑傲江湖"所在的字段是?????,其余为中文的字段为乱码。
1.把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是输出就是乱码了。(鱼和熊掌不能兼得)
2.Mysql中相应数据库的字符集为none(没有什么gb2312)
连接字符串
"jdbc:mysql://localhost/book?user=root"
改成
"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=8859_1"
输出和输入全变成了?????(问号)
改成
"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"
还是乱码!
3.Mysql的Jdbc驱动换成2.0.4和2.0.7都不行,应该不是这里的问题吧?
4.在读写数据库为Access2000的文件中无任何问题。
请大虾们给出个解决方法或者介绍相关文档给我,不胜感激!
9 个解决方案
#1
在所有的jsp中加入
<%
request.setCharacterEncoding("GB2312");
%>
<%
request.setCharacterEncoding("GB2312");
%>
#2
首先,用
"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"
然后
String s1="笑傲江湖";
s1=new String(s1.getBytes("gb2312"));
String sql="insert into bookinfo values('000006','"+s1+"','金庸','三联出版社',5,'武侠名著')";
s.executeUpdate(sql);
out.print("插入成功");
s.close();
C.close();
}
catch (SQLException e) {
out.print("Error");
}
"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"
然后
String s1="笑傲江湖";
s1=new String(s1.getBytes("gb2312"));
String sql="insert into bookinfo values('000006','"+s1+"','金庸','三联出版社',5,'武侠名著')";
s.executeUpdate(sql);
out.print("插入成功");
s.close();
C.close();
}
catch (SQLException e) {
out.print("Error");
}
#3
baitianhai(hong)
用了"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"
整个页面就显示乱码了。。。
用了"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"
整个页面就显示乱码了。。。
#4
当你从数据库中度数据显示在页面上时,是没有中文问题的
但是当你想数据库中写数据时就会出现中文乱码问题,比较通用的写法是,写一个字符集的转换函数,凡是插入中文的地方都要调用该函数:
public static String charConvert(String strSource){
if (strSource == null){
return "";
}
else{
try{
//return new String(strSource.getBytes("GB2312"), "ISO-8859-1");
String str = new String(strSource.getBytes("ISO-8859-1"), "GB2312");
System.out.println(str);
return str;
}
catch (Exception ex){
System.out.println(ex.toString());
return "";
}
}
}
这样就可以了,记住从数据库中读数据时,不要调用该函数,否则会出现乱码。
但是当你想数据库中写数据时就会出现中文乱码问题,比较通用的写法是,写一个字符集的转换函数,凡是插入中文的地方都要调用该函数:
public static String charConvert(String strSource){
if (strSource == null){
return "";
}
else{
try{
//return new String(strSource.getBytes("GB2312"), "ISO-8859-1");
String str = new String(strSource.getBytes("ISO-8859-1"), "GB2312");
System.out.println(str);
return str;
}
catch (Exception ex){
System.out.println(ex.toString());
return "";
}
}
}
这样就可以了,记住从数据库中读数据时,不要调用该函数,否则会出现乱码。
#5
把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是输出就是乱码了。(
#6
下面这个方法我用了一下,读写Mysql数据库均无问题!楼主可以试试:
可以通过servlet filter的方式!
在tomcat目录下/wepapps/examples/WEB-INF/classes/filters有一个文件SetCharacte
rEncodingFilter.class
copy到你的classes/filters目录下
再在web.xml加上
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以后就不用在jsp中转码了
可以通过servlet filter的方式!
在tomcat目录下/wepapps/examples/WEB-INF/classes/filters有一个文件SetCharacte
rEncodingFilter.class
copy到你的classes/filters目录下
再在web.xml加上
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以后就不用在jsp中转码了
#7
在web.xml文件里加
<context-param>
<param-name>weblogic.httpd.inputcharset./*</param-name>
<param-value>GB2312</param-value>
</context-param>
<context-param>
<param-name>weblogic.httpd.inputcharset./*</param-name>
<param-value>GB2312</param-value>
</context-param>
#8
以下文章肯定对你有帮助,仔细看了!
关于JSP读写MySQL数据库的中文问题的测试
测试代码:
1、 检测WEB服务器端当前语言设置:
String srcEncoding = java.lang.System.getProperty("file.encoding");
out.print(srcEncoding);
获取JSP运行时所在的电脑(即WEB服务器)系统的file.encoding属性可查出系统当前的语言设置。
这一步获得的语言设置值,在后面的测试记录表中,称为“语言检测值”。
2、 设置向客户端输出的字符集:
<%@page contentType="text/html;charset=GB2312"%>(斜体部分可替换为BIG5或GBK,下同)
这里的GB2312或BIG5或GBK,在后面的测试记录表中,称为“网页字符集”。
3、 将用户的输入转换为目标字符集:
JSP中:
引用bean:<jsp:useBean id="IDIIL" scope="page" class="IDIIL.IDIILPublic"/>
转换输入值:IDIIL.convertStr(request.getParameter("Name"),"ISO8859-1", "GB2312");
Bean中:
转换函数convertStr代码:
public String convertStr(String str, String FromEncoding, String ToEncoding) throws UnsupportedEncodingException
{
String temp_src = str;
byte[] temp_mid = temp_src.getBytes(FromEncoding);
String temp_dst = new String(temp_mid, ToEncoding);
return temp_dst;
}
4、 显示中文内容:
转换字符集后显示:<%=IDIIL.convertStr(rs.getString("Name"),"ISO8859-1","GB2312")%>
不转换字符集即显示:<%=rs.getString("Name")%>
...测试总结:
1、 最简单通用的中文字符处理方案如下:
对简体中文系统:
1) Windows2000或Redhat Linux7.0 WEB服务器端内核置为简体中文,Redhat Linux7.0 WEB服务器还可置为英文;
2) 网页字符集设为简体中文;
3) 将输入内容转换为简体中文存储;
4) 输出时不作字符集转换。
对繁体中文系统,将上述简体中文系统处理方案中的简体中文替换为繁体中文即可。
英文Windows2000服务器,可安装(免费?)多语言包,即可使用简体或繁体内核。
注:目前只能将中文内容以POST方式提交,尚未解决以GET方式提交中文参数的问题。
2、 GBK字符集对GB2312支持很好,但对Big5支持并不完全,因此,不建议使用GBK作为网页字符集,而对简体中文与繁体中文系统分别使用GB2312与Big5字符集
********************************************************************
* 解决中文问题,ISO转为GBK编码,用于POST,GET方式取得数据
* @param str 原始文本
* @return 转码后的文本
*/
public String iso2gb(String str) {
if (str != null) {
byte[] tmpbyte=null;
try {
tmpbyte=str.getBytes("ISO8859_1");
}
catch (UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.iso2gb :"+e.getMessage());
}
try {
str=new String(tmpbyte,"GBK");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
}
return str;
}
/**
* 解决中文问题,GBK转ISO编码,用于从数据库中存入转码
* @param str 原始文本
* @return 转换后文本
*/
public String gb2iso(String str) {
if (str != null) {
byte[] tmpbyte=null;
try {
tmpbyte=str.getBytes("GBK");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
try {
str=new String(tmpbyte,"ISO8859_1");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
}
return str;
}
关于JSP读写MySQL数据库的中文问题的测试
测试代码:
1、 检测WEB服务器端当前语言设置:
String srcEncoding = java.lang.System.getProperty("file.encoding");
out.print(srcEncoding);
获取JSP运行时所在的电脑(即WEB服务器)系统的file.encoding属性可查出系统当前的语言设置。
这一步获得的语言设置值,在后面的测试记录表中,称为“语言检测值”。
2、 设置向客户端输出的字符集:
<%@page contentType="text/html;charset=GB2312"%>(斜体部分可替换为BIG5或GBK,下同)
这里的GB2312或BIG5或GBK,在后面的测试记录表中,称为“网页字符集”。
3、 将用户的输入转换为目标字符集:
JSP中:
引用bean:<jsp:useBean id="IDIIL" scope="page" class="IDIIL.IDIILPublic"/>
转换输入值:IDIIL.convertStr(request.getParameter("Name"),"ISO8859-1", "GB2312");
Bean中:
转换函数convertStr代码:
public String convertStr(String str, String FromEncoding, String ToEncoding) throws UnsupportedEncodingException
{
String temp_src = str;
byte[] temp_mid = temp_src.getBytes(FromEncoding);
String temp_dst = new String(temp_mid, ToEncoding);
return temp_dst;
}
4、 显示中文内容:
转换字符集后显示:<%=IDIIL.convertStr(rs.getString("Name"),"ISO8859-1","GB2312")%>
不转换字符集即显示:<%=rs.getString("Name")%>
...测试总结:
1、 最简单通用的中文字符处理方案如下:
对简体中文系统:
1) Windows2000或Redhat Linux7.0 WEB服务器端内核置为简体中文,Redhat Linux7.0 WEB服务器还可置为英文;
2) 网页字符集设为简体中文;
3) 将输入内容转换为简体中文存储;
4) 输出时不作字符集转换。
对繁体中文系统,将上述简体中文系统处理方案中的简体中文替换为繁体中文即可。
英文Windows2000服务器,可安装(免费?)多语言包,即可使用简体或繁体内核。
注:目前只能将中文内容以POST方式提交,尚未解决以GET方式提交中文参数的问题。
2、 GBK字符集对GB2312支持很好,但对Big5支持并不完全,因此,不建议使用GBK作为网页字符集,而对简体中文与繁体中文系统分别使用GB2312与Big5字符集
********************************************************************
* 解决中文问题,ISO转为GBK编码,用于POST,GET方式取得数据
* @param str 原始文本
* @return 转码后的文本
*/
public String iso2gb(String str) {
if (str != null) {
byte[] tmpbyte=null;
try {
tmpbyte=str.getBytes("ISO8859_1");
}
catch (UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.iso2gb :"+e.getMessage());
}
try {
str=new String(tmpbyte,"GBK");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
}
return str;
}
/**
* 解决中文问题,GBK转ISO编码,用于从数据库中存入转码
* @param str 原始文本
* @return 转换后文本
*/
public String gb2iso(String str) {
if (str != null) {
byte[] tmpbyte=null;
try {
tmpbyte=str.getBytes("GBK");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
try {
str=new String(tmpbyte,"ISO8859_1");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
}
return str;
}
#9
经过我的多次测试,只有umljsp(夜未央天未白)的方法能够解决我这里发生的问题(也许每个人的开发环境有差异而引起解决方法的不同)。
感谢所有提建议给我的朋友!非常感谢!
通过测试,学习,再测试,再学习,我觉得自己有必要总结一下,有说的不对的地方请大家指正,另外某些专业性分析可能来自别的大虾的贴子。
1.运行环境:
Win2000(经查,当前语言设置为GBK)
Tomcat4.1.24
Jdk1.4.1_02
Mysql4.0.13(数据库的字符集设为none)
Mysql的Jdbc驱动mm.mysql-2.0.11-bin.jar
2.出现的问题:读写Mysql数据库出现乱码(或????问号)
a.把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是中文输 出就是乱码了。
3.分析
我们所用到的数据库读写操作都是在Java环境下完成的,JAVA 语言默认采用Unicode处理字符。
Mysql和Java之间兼容的似乎很好,
这就是为什么如果我们不对Jsp的输出字符集做任何修改(如加上charset=gb2312),则Mysql数据库的读写都应该没问题(如上述的a情况)的原因(只是读出的中文输出为乱码)。
这一点在Access2000上反而没有任何问题,看来是Access2000对GBK(gb2312)编码的支持比较好。
如果朋友们在Mysql的读写数据库中遇到问题,可以试试如下方法:
(以下方法参照umljsp(夜未央天未白)给出的iso2gb()和gb2iso()方法)
方法1:
1.连接数据库 "jdbc:mysql://localhost/book?user=root"
2.读数据库 不需要转码
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现
方法2:
1.连接数据库 jdbc:mysql://localhost/test?user=root&useUnicode=true;characterEncoding=8859_1"
2.读数据库 执行iso2gb(String str)方法。具体参考此方法的实现
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现
从上面看似乎方法2的形式更对称一些,不过在以后免不了要多写一个转换编码的函数,从页面上看好像是不太舒服,不知大虾们有没有完美的解决方法?
感谢所有提建议给我的朋友!非常感谢!
通过测试,学习,再测试,再学习,我觉得自己有必要总结一下,有说的不对的地方请大家指正,另外某些专业性分析可能来自别的大虾的贴子。
1.运行环境:
Win2000(经查,当前语言设置为GBK)
Tomcat4.1.24
Jdk1.4.1_02
Mysql4.0.13(数据库的字符集设为none)
Mysql的Jdbc驱动mm.mysql-2.0.11-bin.jar
2.出现的问题:读写Mysql数据库出现乱码(或????问号)
a.把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是中文输 出就是乱码了。
3.分析
我们所用到的数据库读写操作都是在Java环境下完成的,JAVA 语言默认采用Unicode处理字符。
Mysql和Java之间兼容的似乎很好,
这就是为什么如果我们不对Jsp的输出字符集做任何修改(如加上charset=gb2312),则Mysql数据库的读写都应该没问题(如上述的a情况)的原因(只是读出的中文输出为乱码)。
这一点在Access2000上反而没有任何问题,看来是Access2000对GBK(gb2312)编码的支持比较好。
如果朋友们在Mysql的读写数据库中遇到问题,可以试试如下方法:
(以下方法参照umljsp(夜未央天未白)给出的iso2gb()和gb2iso()方法)
方法1:
1.连接数据库 "jdbc:mysql://localhost/book?user=root"
2.读数据库 不需要转码
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现
方法2:
1.连接数据库 jdbc:mysql://localhost/test?user=root&useUnicode=true;characterEncoding=8859_1"
2.读数据库 执行iso2gb(String str)方法。具体参考此方法的实现
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现
从上面看似乎方法2的形式更对称一些,不过在以后免不了要多写一个转换编码的函数,从页面上看好像是不太舒服,不知大虾们有没有完美的解决方法?
#1
在所有的jsp中加入
<%
request.setCharacterEncoding("GB2312");
%>
<%
request.setCharacterEncoding("GB2312");
%>
#2
首先,用
"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"
然后
String s1="笑傲江湖";
s1=new String(s1.getBytes("gb2312"));
String sql="insert into bookinfo values('000006','"+s1+"','金庸','三联出版社',5,'武侠名著')";
s.executeUpdate(sql);
out.print("插入成功");
s.close();
C.close();
}
catch (SQLException e) {
out.print("Error");
}
"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"
然后
String s1="笑傲江湖";
s1=new String(s1.getBytes("gb2312"));
String sql="insert into bookinfo values('000006','"+s1+"','金庸','三联出版社',5,'武侠名著')";
s.executeUpdate(sql);
out.print("插入成功");
s.close();
C.close();
}
catch (SQLException e) {
out.print("Error");
}
#3
baitianhai(hong)
用了"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"
整个页面就显示乱码了。。。
用了"jdbc:mysql://localhost/book?user=root&useUnicode=true;characterEncoding=gb2312"
整个页面就显示乱码了。。。
#4
当你从数据库中度数据显示在页面上时,是没有中文问题的
但是当你想数据库中写数据时就会出现中文乱码问题,比较通用的写法是,写一个字符集的转换函数,凡是插入中文的地方都要调用该函数:
public static String charConvert(String strSource){
if (strSource == null){
return "";
}
else{
try{
//return new String(strSource.getBytes("GB2312"), "ISO-8859-1");
String str = new String(strSource.getBytes("ISO-8859-1"), "GB2312");
System.out.println(str);
return str;
}
catch (Exception ex){
System.out.println(ex.toString());
return "";
}
}
}
这样就可以了,记住从数据库中读数据时,不要调用该函数,否则会出现乱码。
但是当你想数据库中写数据时就会出现中文乱码问题,比较通用的写法是,写一个字符集的转换函数,凡是插入中文的地方都要调用该函数:
public static String charConvert(String strSource){
if (strSource == null){
return "";
}
else{
try{
//return new String(strSource.getBytes("GB2312"), "ISO-8859-1");
String str = new String(strSource.getBytes("ISO-8859-1"), "GB2312");
System.out.println(str);
return str;
}
catch (Exception ex){
System.out.println(ex.toString());
return "";
}
}
}
这样就可以了,记住从数据库中读数据时,不要调用该函数,否则会出现乱码。
#5
把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是输出就是乱码了。(
#6
下面这个方法我用了一下,读写Mysql数据库均无问题!楼主可以试试:
可以通过servlet filter的方式!
在tomcat目录下/wepapps/examples/WEB-INF/classes/filters有一个文件SetCharacte
rEncodingFilter.class
copy到你的classes/filters目录下
再在web.xml加上
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以后就不用在jsp中转码了
可以通过servlet filter的方式!
在tomcat目录下/wepapps/examples/WEB-INF/classes/filters有一个文件SetCharacte
rEncodingFilter.class
copy到你的classes/filters目录下
再在web.xml加上
<filter>
<filter-name>Set Character Encoding</filter-name>
<filter-class>filters.SetCharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>gb2312</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>Set Character Encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
以后就不用在jsp中转码了
#7
在web.xml文件里加
<context-param>
<param-name>weblogic.httpd.inputcharset./*</param-name>
<param-value>GB2312</param-value>
</context-param>
<context-param>
<param-name>weblogic.httpd.inputcharset./*</param-name>
<param-value>GB2312</param-value>
</context-param>
#8
以下文章肯定对你有帮助,仔细看了!
关于JSP读写MySQL数据库的中文问题的测试
测试代码:
1、 检测WEB服务器端当前语言设置:
String srcEncoding = java.lang.System.getProperty("file.encoding");
out.print(srcEncoding);
获取JSP运行时所在的电脑(即WEB服务器)系统的file.encoding属性可查出系统当前的语言设置。
这一步获得的语言设置值,在后面的测试记录表中,称为“语言检测值”。
2、 设置向客户端输出的字符集:
<%@page contentType="text/html;charset=GB2312"%>(斜体部分可替换为BIG5或GBK,下同)
这里的GB2312或BIG5或GBK,在后面的测试记录表中,称为“网页字符集”。
3、 将用户的输入转换为目标字符集:
JSP中:
引用bean:<jsp:useBean id="IDIIL" scope="page" class="IDIIL.IDIILPublic"/>
转换输入值:IDIIL.convertStr(request.getParameter("Name"),"ISO8859-1", "GB2312");
Bean中:
转换函数convertStr代码:
public String convertStr(String str, String FromEncoding, String ToEncoding) throws UnsupportedEncodingException
{
String temp_src = str;
byte[] temp_mid = temp_src.getBytes(FromEncoding);
String temp_dst = new String(temp_mid, ToEncoding);
return temp_dst;
}
4、 显示中文内容:
转换字符集后显示:<%=IDIIL.convertStr(rs.getString("Name"),"ISO8859-1","GB2312")%>
不转换字符集即显示:<%=rs.getString("Name")%>
...测试总结:
1、 最简单通用的中文字符处理方案如下:
对简体中文系统:
1) Windows2000或Redhat Linux7.0 WEB服务器端内核置为简体中文,Redhat Linux7.0 WEB服务器还可置为英文;
2) 网页字符集设为简体中文;
3) 将输入内容转换为简体中文存储;
4) 输出时不作字符集转换。
对繁体中文系统,将上述简体中文系统处理方案中的简体中文替换为繁体中文即可。
英文Windows2000服务器,可安装(免费?)多语言包,即可使用简体或繁体内核。
注:目前只能将中文内容以POST方式提交,尚未解决以GET方式提交中文参数的问题。
2、 GBK字符集对GB2312支持很好,但对Big5支持并不完全,因此,不建议使用GBK作为网页字符集,而对简体中文与繁体中文系统分别使用GB2312与Big5字符集
********************************************************************
* 解决中文问题,ISO转为GBK编码,用于POST,GET方式取得数据
* @param str 原始文本
* @return 转码后的文本
*/
public String iso2gb(String str) {
if (str != null) {
byte[] tmpbyte=null;
try {
tmpbyte=str.getBytes("ISO8859_1");
}
catch (UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.iso2gb :"+e.getMessage());
}
try {
str=new String(tmpbyte,"GBK");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
}
return str;
}
/**
* 解决中文问题,GBK转ISO编码,用于从数据库中存入转码
* @param str 原始文本
* @return 转换后文本
*/
public String gb2iso(String str) {
if (str != null) {
byte[] tmpbyte=null;
try {
tmpbyte=str.getBytes("GBK");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
try {
str=new String(tmpbyte,"ISO8859_1");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
}
return str;
}
关于JSP读写MySQL数据库的中文问题的测试
测试代码:
1、 检测WEB服务器端当前语言设置:
String srcEncoding = java.lang.System.getProperty("file.encoding");
out.print(srcEncoding);
获取JSP运行时所在的电脑(即WEB服务器)系统的file.encoding属性可查出系统当前的语言设置。
这一步获得的语言设置值,在后面的测试记录表中,称为“语言检测值”。
2、 设置向客户端输出的字符集:
<%@page contentType="text/html;charset=GB2312"%>(斜体部分可替换为BIG5或GBK,下同)
这里的GB2312或BIG5或GBK,在后面的测试记录表中,称为“网页字符集”。
3、 将用户的输入转换为目标字符集:
JSP中:
引用bean:<jsp:useBean id="IDIIL" scope="page" class="IDIIL.IDIILPublic"/>
转换输入值:IDIIL.convertStr(request.getParameter("Name"),"ISO8859-1", "GB2312");
Bean中:
转换函数convertStr代码:
public String convertStr(String str, String FromEncoding, String ToEncoding) throws UnsupportedEncodingException
{
String temp_src = str;
byte[] temp_mid = temp_src.getBytes(FromEncoding);
String temp_dst = new String(temp_mid, ToEncoding);
return temp_dst;
}
4、 显示中文内容:
转换字符集后显示:<%=IDIIL.convertStr(rs.getString("Name"),"ISO8859-1","GB2312")%>
不转换字符集即显示:<%=rs.getString("Name")%>
...测试总结:
1、 最简单通用的中文字符处理方案如下:
对简体中文系统:
1) Windows2000或Redhat Linux7.0 WEB服务器端内核置为简体中文,Redhat Linux7.0 WEB服务器还可置为英文;
2) 网页字符集设为简体中文;
3) 将输入内容转换为简体中文存储;
4) 输出时不作字符集转换。
对繁体中文系统,将上述简体中文系统处理方案中的简体中文替换为繁体中文即可。
英文Windows2000服务器,可安装(免费?)多语言包,即可使用简体或繁体内核。
注:目前只能将中文内容以POST方式提交,尚未解决以GET方式提交中文参数的问题。
2、 GBK字符集对GB2312支持很好,但对Big5支持并不完全,因此,不建议使用GBK作为网页字符集,而对简体中文与繁体中文系统分别使用GB2312与Big5字符集
********************************************************************
* 解决中文问题,ISO转为GBK编码,用于POST,GET方式取得数据
* @param str 原始文本
* @return 转码后的文本
*/
public String iso2gb(String str) {
if (str != null) {
byte[] tmpbyte=null;
try {
tmpbyte=str.getBytes("ISO8859_1");
}
catch (UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.iso2gb :"+e.getMessage());
}
try {
str=new String(tmpbyte,"GBK");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
}
return str;
}
/**
* 解决中文问题,GBK转ISO编码,用于从数据库中存入转码
* @param str 原始文本
* @return 转换后文本
*/
public String gb2iso(String str) {
if (str != null) {
byte[] tmpbyte=null;
try {
tmpbyte=str.getBytes("GBK");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
try {
str=new String(tmpbyte,"ISO8859_1");
}
catch(UnsupportedEncodingException e) {
System.out.println("Error: Method: dbconn.gb2iso :"+e.getMessage());
}
}
return str;
}
#9
经过我的多次测试,只有umljsp(夜未央天未白)的方法能够解决我这里发生的问题(也许每个人的开发环境有差异而引起解决方法的不同)。
感谢所有提建议给我的朋友!非常感谢!
通过测试,学习,再测试,再学习,我觉得自己有必要总结一下,有说的不对的地方请大家指正,另外某些专业性分析可能来自别的大虾的贴子。
1.运行环境:
Win2000(经查,当前语言设置为GBK)
Tomcat4.1.24
Jdk1.4.1_02
Mysql4.0.13(数据库的字符集设为none)
Mysql的Jdbc驱动mm.mysql-2.0.11-bin.jar
2.出现的问题:读写Mysql数据库出现乱码(或????问号)
a.把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是中文输 出就是乱码了。
3.分析
我们所用到的数据库读写操作都是在Java环境下完成的,JAVA 语言默认采用Unicode处理字符。
Mysql和Java之间兼容的似乎很好,
这就是为什么如果我们不对Jsp的输出字符集做任何修改(如加上charset=gb2312),则Mysql数据库的读写都应该没问题(如上述的a情况)的原因(只是读出的中文输出为乱码)。
这一点在Access2000上反而没有任何问题,看来是Access2000对GBK(gb2312)编码的支持比较好。
如果朋友们在Mysql的读写数据库中遇到问题,可以试试如下方法:
(以下方法参照umljsp(夜未央天未白)给出的iso2gb()和gb2iso()方法)
方法1:
1.连接数据库 "jdbc:mysql://localhost/book?user=root"
2.读数据库 不需要转码
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现
方法2:
1.连接数据库 jdbc:mysql://localhost/test?user=root&useUnicode=true;characterEncoding=8859_1"
2.读数据库 执行iso2gb(String str)方法。具体参考此方法的实现
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现
从上面看似乎方法2的形式更对称一些,不过在以后免不了要多写一个转换编码的函数,从页面上看好像是不太舒服,不知大虾们有没有完美的解决方法?
感谢所有提建议给我的朋友!非常感谢!
通过测试,学习,再测试,再学习,我觉得自己有必要总结一下,有说的不对的地方请大家指正,另外某些专业性分析可能来自别的大虾的贴子。
1.运行环境:
Win2000(经查,当前语言设置为GBK)
Tomcat4.1.24
Jdk1.4.1_02
Mysql4.0.13(数据库的字符集设为none)
Mysql的Jdbc驱动mm.mysql-2.0.11-bin.jar
2.出现的问题:读写Mysql数据库出现乱码(或????问号)
a.把第一行的<%@ page contentType="text/html;charset=gb2312" %>去掉,写入就正常了,但是中文输 出就是乱码了。
3.分析
我们所用到的数据库读写操作都是在Java环境下完成的,JAVA 语言默认采用Unicode处理字符。
Mysql和Java之间兼容的似乎很好,
这就是为什么如果我们不对Jsp的输出字符集做任何修改(如加上charset=gb2312),则Mysql数据库的读写都应该没问题(如上述的a情况)的原因(只是读出的中文输出为乱码)。
这一点在Access2000上反而没有任何问题,看来是Access2000对GBK(gb2312)编码的支持比较好。
如果朋友们在Mysql的读写数据库中遇到问题,可以试试如下方法:
(以下方法参照umljsp(夜未央天未白)给出的iso2gb()和gb2iso()方法)
方法1:
1.连接数据库 "jdbc:mysql://localhost/book?user=root"
2.读数据库 不需要转码
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现
方法2:
1.连接数据库 jdbc:mysql://localhost/test?user=root&useUnicode=true;characterEncoding=8859_1"
2.读数据库 执行iso2gb(String str)方法。具体参考此方法的实现
3.写数据库 执行gb2iso(String str)方法。具体参考此方法的实现
从上面看似乎方法2的形式更对称一些,不过在以后免不了要多写一个转换编码的函数,从页面上看好像是不太舒服,不知大虾们有没有完美的解决方法?