JSP頁面顯示中文亂碼的解決方案

在使用JSP的過程當中,最令人頭疼的一個問題就是中文亂碼問題,要解決這個問題首先要知道問題出在哪裏,而後再找解決方案,下面就列出了具體的步驟,只要按如下步驟去作,解決JSP頁面顯示中文亂碼的問題就很容易了。html

1,首先developer要明確本身爲何會遇到亂碼,遇到什麼樣的亂碼(無心義的符號仍是一串問號或者其它什麼東西)。新手遇到一堆很亂的字符時一般不知所措,最直接的反映就是打開google搜索「java中文」(這個字符串在搜索引擎上的查詢頻率很是高),而後一個一個的去看別人的解決方法。這樣作沒有錯,可是很難達到目的,緣由下面會提到。總之,出現亂碼的緣由是很是多的,解決的方法也徹底不同,要解決問題必須先分析本身的」上下文環境」。java

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

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的,那就。。。sql

b,若是用上面的步驟能獲得正確的中文,說明你的數據確定是在的,只不過是界面中沒有正確顯示而已。那麼第二步就該糾正你的view部分了,一般須要檢查的是jsp中是否選擇了正確的頁面編碼。在此要聲明被不少人誤解的一點,那就是<%@ page contentType=」text/html; charset=GB2312〃 %>指令和<META http-equiv=Content-Typecontent=」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的characterset,每一個table,column均可以指定編碼,不指定就是ISO8895_1,所以jdbc取出數據後會根據column的character set來進行編碼,而再也不是用一個全局的參數來取全部的數據了。oracle

總之,遇到 JSP頁面顯示中文亂碼的問題,必定不要急,要先分析出緣由再找解決方案,這樣不但能節省不少時間,並且之後再遇到這個問題就很容易處理了。jsp

相關文章
相關標籤/搜索