论坛首页 Java版

请问如何解决中文问题

浏览 3625 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
最后更新时间:2004-11-25
我搜索了论坛中有关中文问题的帖子,没有发现一个最终的解决方法。以前我从来不觉得有中文问题的存在(可能是我的做法避免出现了一些问题),直到今天才发现其实我依然没有解决这个问题。

我以前的做法是这样的(我用的mysql):
1.页面采用:
[code:1]<%@ page contentType="text/html;charset=ISO_8859_1"%>[/code:1]
2.不采用任何filter
3.不采用:
[code:1]jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=GBK[/code:1]
而是直接使用:
[code:1]jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true
[/code:1]

在这样的情况下,我在jsp页面中使用中文,插入数据库中也是中文,从数据库读出后显示在jsp上也是中文。

但是今天我偶尔在我的servlet(struts中的Action)中写了一句中文,然后执行数据库操作代码后,发现数据库中是乱码,再从数据库中读出的也是乱码。

我尝试了很多论坛中提示的方法,包括设置url,使用filter,始终无法做到jsp和servlet同时中文正确。希望有类似经验的朋友,提供一下解决的方法。
   
最后更新时间:2004-11-25
最近也在搞MYSQL,也有中文问题,于是上网搜寻解决方案。

不知道你用的是什么版本的!

你可以在 my.ini中修改default-character-set=gbk;试试!记得重启服务器!

我还没有试过 下班回去再试
   
0 请登录后投票
最后更新时间:2004-11-26
一般的中文解决办法都是从request和response两个方面着手的。通常的解决办法可能正好和楼主相反是:
1。reqeust用filter来设置reqeust 的CharacterEncoding是最方便的的办法。不然的话你要每个jsp,servlet都要设置,烦死你。
2。response只能在每个jsp里写<%@ page contentType="text/html;CHARSET=utf8"%>,servlet里写response.setContentType(text/html;CHARSET=utf8);
3。数据库里应该指定编码,如mysql用jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=GBK
这样应该不会再出中文问题了
   
0 请登录后投票
最后更新时间:2004-11-26
你的系统应该是中文环境,可以把你的那个servlet用8859-1来编译即可,或者直接把中文转码。
   
0 请登录后投票
最后更新时间:2004-11-28
引用

一般的中文解决办法都是从request和response两个方面着手的。通常的解决办法可能正好和楼主相反是:
1。reqeust用filter来设置reqeust 的CharacterEncoding是最方便的的办法。不然的话你要每个jsp,servlet都要设置,烦死你。
2。response只能在每个jsp里写<%@ page contentType="text/html;CHARSET=utf8"%>,servlet里写 response.setContentType(text/html;CHARSET=utf8);
3。数据库里应该指定编码,如mysql用jdbc:mysql://127.0.0.1:3306/test?autoReconnect=true&useUnicode=true&characterEncoding=GBK
这样应该不会再出中文问题了

我按照你介绍的方法试了以下,发现在jsp输入的中文存到数据库中还是乱码。不知道是我的filter写的问题还是什么其它的问题,我也不清楚。

我在页面的编码中设置ISO_8859_1是有道理的,因为我认为,页面提交的时候,由于它是ISO_8859_1格式的,而数据库也是ISO_8859_1格式的,所以它没有做任何的编码转化,你在页面上输入什么,写到数据库里面就是什么,在这种情况下,没有任何从输入角度的编码格式问题。同时,从数据库取出时,也没有作任何的编码转化,显示到JSP页面中,页面是ISO_8859_1,所以原封不动把读出的数据显示出来,这样也不会有中文问题。

我所理解的servlet中的编码问题可能是由于我的eclipse在默认情况下,把servlet当作GBK编译了,于是出现了编码格式与数据库不一致。明天我可能去单位里面试一下把servlet用ISO_8859_1格式编译成class文件试试,可能就会好了。

谢谢大家的回复。如果有其它的方法大家一起讨论以下吧。
   
0 请登录后投票
最后更新时间:2004-11-30
有谁用过tapestry解决过MYSQL编码问题的吗?
   
0 请登录后投票
最后更新时间:2004-11-30
从根本上解决中文问题可以分两个步骤:

1. 从页面插入到数据库,数据库要正确显示中文.
2. 从数据库取得的数据在页面上要正确显示中文.

解决1.

大多数数据库都是以ISO-8859,先将 SQL 语句按系统缺省编码方式转化为字节数组,再按“ISO-8859-1”编码方式转化为 STRING ,最后送去执行,则中文信息可正确写入数据库。
String name = request.getParameter("name");
String sql_name = new String(name.getBytes(),"ISO-8859-1");
String sql = "insert into test(name) values('" + sql_name + "')";

这步可以用Filter来解决!

解决2.

与第一步相反即可!将数据按“ISO-8859-1” 编码方式转化为字节数组,再按系统缺省编码方式转化为 STRING.

String name = rs.getString("name");
String html_name = new String(name.getBytes("ISO-8859-1"));
out.println(html_name);

*注 :  我用的是tapestry 页面是默认的utf-8
   
0 请登录后投票
最后更新时间:2004-11-30
楼上, 你这个方法在Tapestry中解决了页面编码是UTF-8时的乱码问题吗? 下班回去后试一下看.这个问题郁闷我很久了.
之前我也有做过在后台转码来着. 但是前台依旧是乱码. http://forum.javaeye.com/viewtopic.php?t=9080


吃饭回来重新又试了一遍. 还是不行...
   
0 请登录后投票
最后更新时间:2004-11-30
引用

从根本上解决中文问题可以分两个步骤:

1. 从页面插入到数据库,数据库要正确显示中文.
2. 从数据库取得的数据在页面上要正确显示中文.

解决1.

大多数数据库都是以ISO-8859,先将 SQL 语句按系统缺省编码方式转化为字节数组,再按“ISO-8859-1”编码方式转化为 STRING ,最后送去执行,则中文信息可正确写入数据库。
String name = request.getParameter("name");
String sql_name = new String(name.getBytes(),"ISO-8859-1");
String sql = "insert into test(name) values('" + sql_name + "')";

这步可以用Filter来解决!

解决2.

与第一步相反即可!将数据按“ISO-8859-1” 编码方式转化为字节数组,再按系统缺省编码方式转化为 STRING.

String name = rs.getString("name");
String html_name = new String(name.getBytes("ISO-8859-1"));
out.println(html_name);

*注 : 我用的是tapestry 页面是默认的utf-8


我觉得页面上的中文问题我觉得不难解决,主要是servlet中的中文问题,dengyin2000不知道你有没有在servlet中试试写中文。

另外,你的filter到底怎么写的?为什么我用filter就不成功呢?
   
0 请登录后投票
最后更新时间:2004-12-01
按dengyin2000的说法,是可以解决中文问题。

可是,如果我输入时不编码呢,那我能正确读出中文吗?我的MySQL默认字符集latin1,试了几个,不行。

可到了SqlServer那里,如果我不编码,到可以正确读出中文,再按dengyin2000的说法就不行了,怎么回事?

现在用mysql就在url后加上编码格式,用sqlserver,就把一些中文字段改成nvarchar的。

知其然而不知其所以然
   
0 请登录后投票
论坛首页 Java版

跳转论坛:
JavaEye推荐