首先我們要了解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
說明配置文件已經修改成功,數據庫已經支持中文啦!