(转帖)Jive的中文问题及解决办法及关联转帖

 首页 » 研究文集 » Jive 研究   搜索标题相关文章      发表评论     开始监控     加入收藏夹 

Jive的中文问题及解决办法

bruce 原创  (参与分:520452,专家分:6410)   发表:2002-08-31 12:52   阅读:12622次 

 

说明:本文没有特别指出的地方的环境配置均为:

Windows XP + Tomcat 3.3a + mysql 3.23.51-nt + mysql-connector-java-2.0.14-bin.jar

Jive中产出乱码的原因是多方面的,包括操作系统、Web服务器(比如Tomcat)、Jive的设置、数据库(链接)的编码方式、页面的编码等多个环节,任何一个环节出现编码问题,都会导致你的最终页面出现乱码。相应的解决问题也需要分多步进行。比如,你创建一个论坛,然后页面显示是乱码,你可以根据如下顺序定位问题:

1. 查看数据库中的记录是否是乱码。如果是,再试着修改数据库的链接的编码方式;如果仍然乱码,说明在向后台传送数据前就发生了编码问题,可以查看页面的编码方式、或者在提交前进行如下编码转换:

String new = new String(old.getBytes(“8859_1”), “GB2312”);

2. 如果数据库中正常显示中文,那么说明是页面显示的问题。

在上述每一步,你总是可以使用log语句及时输出,追踪乱码发生的位置。

下面是一些常见的问题,和解决办法。

1. 问:创建论坛或发贴时,输入的中文名显示乱码,查看数据库中,也为乱码。

解决办法:停止Tomcat,修改{JIVE}\WEB-INF\jiveHome\jive_config.xml(在jive.database.defaultProvider节点中):

<serverURL>jdbc:mysql://localhost/jive</serverURL>

为:

<serverURL>jdbc:mysql://localhost/jive?useUnicode=true&characterEncoding=gb2312</serverURL>

注意useUnicode=true与characterEncoding=gb2312之间不要直接使用“&”,需要使用XML转意字符:&加上amp;

2. 问:搜索中文时,search.jsp的输入框中的文字变成了“???”,导致不能搜索出任何结果。

解决办法:将search.jsp页面中的所有的:

/search.jsp...q=<%=(queryText!=null)?queryText:"")%>

修改为:

/search.jsp?...q=<%= (queryText!=null)?java.net.URLEncoder.encode(queryText,"GB2312"):""%>

你还可以参加cherami的一篇文章:

Tomcat下的JIVE2的中文问题的报告

本文会不断完善,欢迎大家把自己解决Jive乱码的经验回复在文后,我会把最新的一些内容及时补充近来,一起来完善本文。给更多的朋友提供方便,先谢谢大家!

 

 

 TOMCAT下的JIVE2的中文问题的报告

 首页 » 研究文集 » Jive 研究   搜索标题相关文章      发表评论 

TOMCAT下的JIVE2的中文问题的报告

cherami 翻译  (参与分:700911,专家分:21389)   发表:2002-05-26 15:44   更新:2002-11-10 18:24   版本:1.0   阅读:7675次 

 

原文摘自jive论坛用户shyguy的帖子。

翻译者:cherami

XXX 注意 XXX:

所有的结论都是基于一下平台:

Winnt4.0(简体中文版) + Sun JDK1.3 + Tomcat4.0-b7 + jive2.0.1 + mysql3.23.38 + org.gjt.mm.mysql.Driver-2.04

在这样的条件下,安装在TOMCAT下的Jive2.0不能像其他JSP应用那样不做任何修改就可以正确的显示中文。我不敢确定但是几个测试的结果告诉我tomcat核心的编码总是8859_1,无论是否在双字节的操作系统下。当客户端输入一些中文,request.getParameter()请求返回的字符串是8859_1,因此如果你使用System.out.println()将输入打印到控制台,它看上去就像"??x?"。如果你在每个JSP文件的开始加上 <%@ page contentType="text/html;charSet=gb2312" %> 标签,中文就可以正确显示,因为tomcat知道它的内核编码是8859_1而输出到客户端的PrintWriter(它是JSP的输出对象)的编码是gb2312,因此PrintWriter在内部做了令人愤怒的8859_1到gb2312的转换。这就是为什么我们总是添加contentType解决中文问题的原因。

但是不幸的是,当我们通过JDBC从数据库提取字符串的时候事情就不一样了。

看看下面的虚拟的代码: str=rec.getString(field); 你能告诉我字符串str的编码吗?

答案是: gb2312!!!

(就像mysql jdbc驱动一样,很多包都根据平台返回字符串的编码,例如 SimpleDateFormat 和 JavaMail。)因此,当你将字符串传递到PrintWrite时,愚蠢的PrintWriter将再次使用8859_1-->gb2312的转换。可怜的客户端别无选择的看到丑陋的????。

令我困惑的是:

request.getParameter()的返回字符串的编码是8859_1,因此向控制台打印时它看上去像??x?,但是Jive可以将字符串用gb2312编码存入数据库!!!

例如,在post.jsp里面,在消息创建发生以前,我将中文主题和内容输出到控制台,它看上去是??x?,但是在mysql数据库里面,SELECT * FROM jiveMessage将返回正确的中文!

同时我也发现response.setLocale()对中文输出没有作用。

如何解决呢:

1. 在输出前使用String.getBytes()反向转换gb2312字符串,这是最愚蠢的方法。

2. 在英文平台下运行服务器。

3. 最最最最好的方法是: 使用其他的 java服务器!

对于TOMCAT用户的建议是:

如果你确实想在一个双字节的操作系统(例如简体中文版的Winnt)上运行TOMCAT,你最好: (1)添加<%@ page contentType="text/html;charSet=gb2312"%>到 \include\brankding\style.jsp 和 \admin\include\global.jsp的第一行(路径是相对TOMCAT的主目录)

(2)反向转换从数据库返回的所有字符串为8859_1编码。这需要修改JIVE核心的所有DBxxxx类,

或者修改JDBC驱动的"result.getString()"进行反向转换,

或者修改TOMCAT内核中的"out"对象进行反向转换。

(3)如果你修改了tomcat内核中的"out对象,在将中文信息传递到jive/index.jsp时你最好使用URLEncode(/dir/URL.jsp?gb2312_msg)。

附:Rexip AppServer 有Record-Breaking Benchmark Results处理Java应用的服务器端中文问题。

版权声明  本篇文章对您是否有帮助?  投票: 是    否     投票结果:     6       3

 

 

 

作者其它文章:

使用Checklist提升项目的质量

提升项目组的开发效率

使用JkUnMount

Apache2.0运行模型分析及性能调整

优化Apache 2.0 性能

作者全部文章     查看作者的Blog 

 

 

  评论人:scorpio_leon    参与分: 365    专家分: 55    来自: 上海

 发表时间: 2002-08-13 17:16 

还有一个解决方案

在不进数据库,需要中文参数的页面使用filter,不要忘记了,filter是可以配置的:)

有既需要进数据库,又需要其他中文参数传递的页面呢?

一般不会有吧,有的就举个例子讨论看?

 

 

  评论人:shyguy    参与分: 23055    专家分: 330    来自: 西湖

 发表时间: 2002-09-18 12:10 

嘿嘿,老了。很久以前的事情了,有些观点甚至是错误的。

对不起了。 

 

这个文章共有 2 条评论,共 1 页 

 

 

 

 

 

One thought on “(转帖)Jive的中文问题及解决办法及关联转帖”

Comments are closed.