Java web開發中的編碼問題

經常在web開發中碰到中文亂碼的問題,一般都是局部性的解決了問題之後就不了了之了。前些天在開發一個小程序,又碰到了中文亂碼的問題,於是下定決心徹底解決這個問題。經過了2天的時間,在網上搜索了一些信息,但大都不具權威性。後來無意中發現萬方數據庫中有關於這方面的論文,下載了三篇看了,受益匪淺。本來是昨天晚上寫心得的,遺憾網速太慢,博客上不了,問題解決後興奮的感覺害得我晚上失眠了。囧!下面總結一下我的收穫,希望可以幫助大家從整體上考慮亂碼問題,從而解決它。
首先我們要了解web開發的整個流程。如下:
總體框架:客服端(一般指瀏覽器)<————>服務器端(Tomcat等)<————>數據庫系統
                       服務器處理                                     數據庫驅動
頁面轉換:html靜態頁面  <————————>   jsp/servlet等   <———————>  數據庫
中文亂碼主要出現在頁面轉換之間,靜態頁面經過服務器轉碼,提交到邏輯處理部分,然後邏輯處理部分通過數據庫驅動與數據庫交換信息。我們要注意5個會影響到編碼的部分。
1、html靜態頁面:這個部分的亂碼比較好解決,直接在<head>標籤中添加頁面設置標籤<meta http-equiv="content-type" content="text/html;charset=GBK"> ,這個標籤的作用是靜態頁面告訴服務器,"我的頁面類型是text/html,編碼是GBK,請你按照GBK編碼方式來解析我的請求"。
2、服務器默認的編碼方式是ISO8859-1。首先服務器會獲取請求編碼,request.getCharacterEncoding(), 如果請求頁面沒有如上面的設置,則獲取結果爲NULL;則服務器使用默認的編碼解析請求。此時請求信息已經經過了從GBK——>ISO8859-1的轉碼。
3、邏輯處理部分,通常爲jsp/servlet。jsp頁面編碼的設置也很簡單,
<%@ page contentType="text/html;charset=GBK" %> ,通過服務器處理後的請求信息要正常顯示,必須轉換編碼,ISO8859-1——>GBK,通常的方法是:new String(str.getBytes("ISO8859-1"),"GBK"),即將請求信息轉爲jsp頁面編碼。至於servlet,我還沒有找到如何設置其編碼的方法,它默認是操作系統的編碼,可以通過codeName= System.getProperty(file.encoding)獲取。然後轉換編碼new String(str.getBytes(codeName),"GBK")即可。對於返回頁面的處理,通過response.setContentType("text/html;charset=GBK")設置返回內容的類型和編碼,應該和返回頁面的內容和編碼相同。
4、數據庫驅動,數據庫連接的默認方式是ISO8859-1。所以在邏輯處理部分的sql語句中如果包含中文,應該先將中文轉碼爲ISO8859-1編碼方式,再填入sql語句中執行操作。對於查詢返回的結果就要執行相反的轉碼操作,從ISO8859-1轉到邏輯處理頁面的編碼。
5、數據庫系統,必須支持中文。對於MySQL數據庫,默認編碼是ISO8859-1,可以設置編碼方式。編輯%MySQL%/conf 目錄下的my.ini文件,在[mysqld]區域修改default-character-set = utf8,在 [client] 區域添加
 default-character-set = utf8,重新啓動服務器,在客服端輸入show variables like 'character_set_%';結果顯示如下:
character_set_client = latin1 
character_set_connection = latin1 
character_set_database = utf8 
character_set_filesystem = binary 
character_set_results = latin1 
character_set_server = utf8 
character_set_system = utf8  
然後輸入show variables like 'collation_%';顯示結果如下:
collation_database = latin1_swedish_ci 
collation_connection = utf8_general_ci 
collation_server = utf8_general_ci  
說明配置文件已經修改成功,數據庫已經支持中文啦!     
 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章