请教一个已有系统数据移置带来的中文问题

    
hecc 03-07-23

请教一个已有系统数据移置带来的中文问题

我们原来有一套在Linux 7.2, resin, apache, mysql 下的一个j2ee应用,它们的语言编码都是iso8859-1,对中文没有作任何的处理,中文进出数据库,显示都没有问题。但是现在客户要求要把数据库移置到AIX下的Oracle 9i上,并且Oracle 9i数据库字符集要求为gbk或gb2312(天知道客户为什么会有这样的要求),现在的现状是原来的应用部是我写的,如果通过改程序在中文进出数据库的时候做转码处理,那工作量不可估计,并且我们也没有源代码。所以修改程序应该是不可行的。

可行的方法一: EncodingFilter
好像EncodingFilter只能对进入数据库的中文做转换处理,中文出来显示
不能处理吧? 我对EncodingFilter还不是很熟悉,不知道能不能对程序不做任何的修改就可以达到目的(请高手回答这个问题)。并且现在系统的Resin版本很低,连<%@ page contentType="text/html;charset=GB2312"%>都不支持,报下面的错误:
Note: sun.tools.javac.Main has been deprecated.
/HeccTest2.jsp:32: Method setCharacterEncoding(java.lang.String) not found in interface javax.servlet.http.HttpServletRequest.
request.setCharacterEncoding("GB2312");
^
1 error, 1 warning

系统的resin和cocoon是配置在一起的,并且系统一直在运行,不能停,所以升级resin的方法也不行。

方法二:修改oracle的jdbc driver,正准备测试,也不知道行不行。


题外话:我开发时对中文的处理都是,安装Linux是选中gb2312中文,编译Mysql时设定charset=gb2312,安装resin,apache,php,然后对中文就不用做任何处理了

AreYouOK?
2003-07-23 16:03

你的Resin连Servlet2.3都不支持?
我有一点不明白,你的字符集问题在数据库上,为什么在Web层设置字符集?

能不能这样,用动态代理拦截所有java.sql.PrepareStatement的setString方法调用,在其中做字符集转换,我没有用过这东西,不知道行不行

java.lang.reflect.Proxy

robbin
2003-07-23 16:43

客户的要求是完全正确的,Oracle必须用GBK。你可以查一下我在前面一个谈到数据库中文问题的帖子。

你们遇到的中文问题只能怪你们自己,你们原来开发的系统中,中文解决方案就非常糟糕,现在迁移数据库出问题那也很正常。就算你们把Oracle改用ISO8859_1字符集暂时解决中文问题,也会存在大量潜在问题,随时都会出现中文乱码。修改Oracle的JDBC Driver更不可取。

热升级Resin根本就不是问题,你难道不会在另一个目录再安装一套Resin吗?

先把新的Resin配置好,不要用6702端口,另改一个端口启动Resin,然后在新的Resin下拷贝一套代码,进行调试,调试好再把目录指回去。

接着,编译Resin的mod_caucho,把它拷贝到Apache的相应的目录下。然后修改apache的httpd.conf,修改mod_caucho的指向,修改Resin的转发端口。

最后,apachectl restart
该命令一执行,整个系统就切换到新的Resin上来了,apache中断服务不会超过3秒钟。

最后给你的关于中文解决方案的建议:

最终极的解决方案是用UTF-8编码,但估计你们改动就大了。打点折扣,你在新的Resin下,要注意配置一个javac的选项,使用GBK编译。仔细看看resin.conf配置文件,有关于服务器的默认编码的选择项。

如果这还不能保证request取到的参数是GBK的话,可以写一个ServletFilter,在web.xml里面配置上所有Servlet/JSP使用这个Filter。

然后把所有JSP页面改成GBK编码。


robbin
2003-07-23 16:56

说点题外话,个人意见,hecc觉得我说的不对也请不要在意。

前面看过你的帖子感觉到你好像对自己的技术还比较自负。所以碰到这个中文问题,你置疑客户的要求是无理的。但是我感觉到你的技术还很不扎实,结果你的置疑就显得你自己很肤浅了。

另外我感觉到你的知识面比较窄,如果你对Linux,Apache和Resin都比较熟悉的话,这个问题其实很好解决,不会让你束手无策。

谁年轻的时候都会比较高傲自负一点,我也不例外,但最好不要因为年轻带来的不成熟影响了你的前途。

hecc
2003-07-23 17:00

谢谢各位的意见。
关于用UTF-8的编码,客户表示了不行,因为客户还有另外的应用读取该系统的数据,要求必须是gbk或gb2312。
原来的系统不是我做的,resin和cocoon的版本都很低,并且他们打包的方式都很怪,resin,apache,mysql都没有一级目录分开,全打包在一个目录里面,如一个bin目录,里面有apache的,resin的,mysql的,我真的是很服啊,原来的系统安装是一个很大的问题。我们怕把现在应用给搞坏了。

现在数据库oracle 9i的编码必须为gb2312,有什么比较简便的方法?

4Go 1 2 3 4 下一页