jsp中文問題解決方案

 

===================================
開發java應用出現亂碼是很常見的,畢竟現在unicode的使用還不是很廣泛,在使用gb2312(包含了gbk簡體,big5繁體)的系統中要正確實現

中文的display和數據庫的存儲是最基本的要求。

==============================
1,首先developer要明確自己爲什麼會遇到亂碼,遇到什麼樣的亂碼(無意義的符號還是一串問號或者其它什麼東西)。
新手遇到一堆很亂的字符時通常不知所措,最直接的反映就是打開google搜索”java中文”(這個字符串在搜索引擎上的查詢頻率非常高),

然後一個一個的去看別人的解決方法。這樣做沒有錯,但是很難達到目的,原因下面會提到。
總之,出現亂碼的原因是非常多的,解決的方法也完全不一樣,要解決問題必須先分析自己的”上下文環境”。

============================
2,具體說來,需要哪些信息才能確定項目中的亂碼的根源。
a,開發者所用的操作系統
b,j2ee容器的名稱,版本
c,數據庫的名稱,版本(精確版本)以及jdbc驅動的版本
d,出現亂碼的source code(比如是system out 出來的,還是jsp頁面中的,如果是jsp中的,那麼頭部聲明的情況也很重要)

===========================================================
3,如何初步分析亂碼出現的原因。
有了上述的信息,基本上就可以發帖求助了,相信放到javaworld等論壇上,很快就會有高手給你提出有效的解決方案的。
當然不能總靠發帖求助,也要試試自行解決問題。如何下手呢?
a,分析一下你的”亂碼”到底是什麼編碼。這個其實不難,比如
System.out.println(testString);
這一段出現了亂碼,那麼不妨用窮舉法猜測一下它的實際編碼格式。
System.out.println(new String(testString.getBytes(”ISO-8859-1″),”gb2312″));
System.out.println(new String(testString.getBytes(”UTF8″),”gb2312″));
System.out.println(new String(testString.getBytes(”GB2312″),”gb2312″));
System.out.println(new String(testString.getBytes(”GBK”),”gb2312″));
System.out.println(new String(testString.getBytes(”BIG5″),”gb2312″));
等等,上述代碼的意思是用制定的編碼格式去讀取testString這個”亂碼”,並轉換成gb2312(此處僅以中文爲例)
然後你看哪一個轉換出來的結果是ok的,那就。。。

b,如果用上面的步驟能得到正確的中文,說明你的數據肯定是在的,只不過是界面中沒有正確顯示而已。那麼第二步就該糾正你的view部分了

,通常需要檢查的是jsp中是否選擇了正確的頁面編碼。

在此要聲明被很多人誤解的一點,那就是<%@ page contentType=”text/html; charset=GB2312″ %>指令和<META http-equiv=Content-Type

content=”text/html; charset=gb2312″>兩者的不同。通常網上的很多文章在提到中文問題時都是說數據庫中選擇unicode或者gb2312存儲,同

時在jsp中用page指令聲明編碼就可以解決。但是我覺得這種說法很不負責任,害的我費了N多時間爲本來並不存在的亂碼而鬱悶。實際上page

的作用是在jsp被編譯成爲html的過程中提供編碼方式讓java來”讀取”表達式當中的String(有點類似於上面的第三個語句的作用),而meta

的作用是衆所周知的爲IE瀏覽器提供編碼選擇,是用來”顯示”最後的數據的。但是沒有看到有人提醒這一點,我一直把page當成meta在用,

導致本來是iso-8859的數據,被page指令讀成gb2312,於是亂碼,所以又加了編碼轉化的函數把所有的string數據都從iso8859轉到gb2312(爲

什麼這麼轉,當時也沒考慮這麼多,因爲這麼做可以正常顯示了,所以就這麼改了,呵呵當時實在沒有時間慢慢排查問題了)。

===============================================================
4,數據庫選擇什麼樣的編碼比較好。
目前流行的DB主要有sql server,mysql,oracle,DB2等,其中mysql作爲免費DB中的老大,性能和功能是得到公認的,安裝配置比較方便,相

應的driver也比較完善,性價比是絕對的OK。所以就以mysql爲例。

我個人建議採用mysql的默認編碼來存儲,也就是iso-8859-1(在mysql的選項中對應於latin-1)。理由主要有這麼幾個,一是iso-8859-1對中

文的支持不錯;二是跟java中的默認編碼一致,至少在很多地方免除了轉換編碼的麻煩;三是默認的比較穩定,兼容性也更好,因爲多編碼的

支持是由具體的DB產品提供的,別說跟其它的DB會不兼容,即使自身的不同版本也可能出現兼容性的問題。

例如mysql 4.0以前的產品中,很多中文的解決方案是利用connection中的characterEncoding字段來制定編碼,比如gb2312什麼的,這樣是ok

的,因爲原數據都是ISO8859_1編碼,jdbc驅動會採用url裏面指定的character set來進行編碼,resultSet.getString(*)取出的就是編碼後的

字符串。這樣就直接拿到gb2312的數據了。

但是mysql 4.1的推出給很多dbadmin帶來了不小的麻煩,因爲mysql4.1支持column level的character set,每個table,column都可以指定編碼

,不指定就是ISO8895_1,因此jdbc取出數據後會根據column的character set來進行編碼,而不再是用一個全局的參數來取所有的數據了。

發佈了51 篇原創文章 · 獲贊 1 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章