足彩总进球数二三球足彩总进球数二三球

TOMCAT下的JIVE2的中文問題分析及解決



作者:不詳    文章來源:足彩总进球数二三球 www.ngfcl.com
發布日期:2005年10月20日
所有的結論都是基于一下平臺:
Winnt4.0(簡體中文版) + Sun JDK1.3 + Tomcat4.0-b7 + jive2.0.1 + mysql3.23.38 + org.gjt.mm.mysql.Driver-2.04

足彩总进球数二三球 www.ngfcl.com 在這樣的條件下,安裝在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"%>到includerankdingstyle.jsp 和adminincludeglobal.jsp

Copyright © 2002-2012 www.ngfcl.com. All rights reserved.
JSP中文網    備案號:粵ICP備09171188號
成都恒??萍擠⒄褂邢薰?nbsp;   成都市一環路南二段6號新瑞樓三樓8號