关于中文显示的问题,与java,jsp,mysql都有关

mechiland 2002-04-03 03:11:02
一个很普通的程序,从一个页面读入数据到mysql数据库,然后将它显示出来。现在存在这样一个问题:数据库中的数据都是正确的,但是显示出来就有些问题了,有些全角字符显示不出来,是一个“?”。目前测试出来的字符是“-”和“ ”(全角的连字符和空格)。想办法得知他的AscII 码分别是8212和57347(有时候却又是57348)。。。但是,有些记录中包含这些字符却又能够正确显示,头大啊。。。。现在我还不知道是哪儿的毛病,盼高手指导!100分送上了!
...全文
19 点赞 收藏 15
写回复
15 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
mechiland 2002-04-07
虽然问题的根没有找到,但我用其他的办法解决了,等会儿给分!
回复
jacob1 2002-04-03
倒~~``

兄弟,难道你就没试试我的方法吗,怎么会是字符集不够大呢,unicode的编码UTF-8能容纳6万多个字,UTF-16就更不用说了
回复
leo_zhangfh 2002-04-03
jacob1(林叶)

public static String unicodeToGb2312(String s)
{
try
{
return new String(s.getBytes("ISO8859_1"),"gb2312");
}
catch(UnsupportedEncodingException uee)
{
return s;
}
}
回复
mechiland 2002-04-03
“安——秦”杂交牛名扬农高会
回复
mechiland 2002-04-03
我说清楚一点:

数据库中的字符是:这是——一个测试字符串
我用其它软件察看数据库,字符能正常显示,但是用rs.getString("XXX")时,"这是"后面的两个字符就显示不出来----"??". 但是,我仅仅打印这个字符串时,又能够正确显示。。。

我怀疑是tomcat 或者 mysql 字符集不够大的原因。
回复
dragonwind 2002-04-03
好像这是java servlet的一个bug,找一找源代码,修改一下
免得总要在自己的程序里改来改去
回复
1wolf 2002-04-03
To jacob1(林叶) :

正解,完全赞同,我也是如此解决的。

To: rootwuyu(wuyu)
“在将从表单中取得的数据存入变量、session,或是调用方法时传参(java不象c有传值的说法),此时字符串已经被改为unicode编码“
这是什么意思,我有些不懂了,我用session传过去的,存在oracle中没有问题呀。我觉得只是mysql对中文支持的问题吧。
回复
jacob1 2002-04-03
哈哈,不好意思,兄弟!
上面那个是我在c++版的账号,一时没留神在这作了回答了,这个才是我在java版的账号,要是给分的话,请给到这个吧 :)

啊? 兄弟,有没有搞清楚转码的含义呢? 例如页面显示的是用GBK编码,mysql中用的却是unicode哟,如果没通过转码,那么显示的结果当然不正确咯,需要提供程序给你转码么? 现在的情况你应该是要把unicode转为GBK吧,用以下程序段吧

public static String unicodeToGb2312(String s)
{
try
{
return new String(s.getBytes("ISO8859_1"),"gb2312");
}
catch(UnsupportedEncodingException uee)
{
return s;
}
}

回复
hiphen1 2002-04-03
啊? 兄弟,有没有搞清楚转码的含义呢? 例如页面显示的是用GBK编码,mysql中用的却是unicode哟,如果没通过转码,那么显示的结果当然不正确咯,需要提供程序给你转码么? 现在的情况你应该是要把unicode转为GBK吧,用以下程序段吧

public static String unicodeToGb2312(String s)
{
try
{
return new String(s.getBytes("ISO8859_1"),"gb2312");
}
catch(UnsupportedEncodingException uee)
{
return s;
}
}
回复
jacob1 2002-04-03
看来稍后我要写篇关于字符编码的段子才行了,似乎很多人在此问题上迷惑哟
回复
jacob1 2002-04-03
没错,你说得很正确,iso-8859-1便是即俗称的Latin-1,西欧字母集,但它和Unicode的头256个字符是完全相同的,而且iso-8859-1前半段也正是ASCII码,因为平时我们页面上的英文和数字不需要转码就是这个原因,因为无论在那种编码方式中,他们都是相同的,

但中文就惨了,需要在unicode的unihan区中转换为GBK这些亚洲编码,所以我们在通常的使用中经常遇到麻烦。

你最好再检查一下你的程序,要是你mysql中的中文显示正常的话,页面就不需要转码,直接rs.getString(..)就行,要是mysql中的是以乱码存储的话,你可以在显示时用上unicodeToGb2312(rs.getString(..)),而且不要忘了这句哟:
<%@ page contentType="text/html;charset=gb2312" %>

要是还不行的话,就把源程贴上来吧
回复
rootwuyu 2002-04-03
sorry,没看清题

我上面说的是我在入库时所遇到的问题,而从数据库中取出数据时,我在resin下,写,response.setContentType="text/html;charset=GBK";就一切ok了
回复
rootwuyu 2002-04-03
我在w2k上用sql2k来做servlet

1、从表单用get/post提交的数据,直接写入数据库,无乱码

2、从表单取得数据,然后存入一个变量,或放入session中,然后在另一个servlet中取出,写入,出现乱码。在写库时使用new String(a.getBytes(),"ISO-8859-1")后无乱码

3、将写入数据库的操作做为类的一个方法。在取得表单get/post数据后,调用这个方法写入,此时出乱码。在写库时使用new String(a.getBytes(),"ISO-8859-1")后无乱码


sql2k写数据时应写入iso-8859-1的编码字符(大多数据库似乎都如此),因此,从表单取得数据直接写入,由于此时字符是iso-8859-1的编码,所以不会出现乱码

在将从表单中取得的数据存入变量、session,或是调用方法时传参(java不象c有传值的说法),此时字符串已经被改为unicode编码,因此写库时要转码。

回复
test09test 2002-04-03
selvert.class里的bug。
回复
mechiland 2002-04-03
试过了,最先试的就是这种方法,但不幸的事,要么显示出“这是??一个测试字符串”,要么就根本不对。
还有,你给的例子不是unicode, 而是iso-8859-1,西方字符集.

回复
发动态
发帖子
Web 开发
创建于2007-09-28

7.9w+

社区成员

Java Web 开发
申请成为版主
社区公告
暂无公告