1. 隻有 字元到位元組 或者 位元組到字元 的轉換才存在編碼轉碼;
3. String隻有一種格式,可認為String是獨立于編碼系統的,通過 getBytes(String charsetName) 可實作編碼轉換。
4. String對象是記憶體資料,string之間不存在編碼變換問題。
5. 編碼轉換場景主要在 I/O , I/O 包括磁盤 I/O 和網絡 I/O:檔案輸入輸出、螢幕、資料庫、浏覽器、伺服器。
6. 在記憶體中倒騰String資料是編碼無關的,比如壓縮編碼。
7. 編碼誤區: new String(str.getBytes("ISO-8859-1"), "GB18030") 這種用法是無意義的,甚至是錯誤的。這種用法是用GB18030編碼将ISO-8859-1編碼格式的位元組資料強制轉換成unicode碼點,不亂碼是運氣!
9. 資料庫JDBC能夠處理 資料庫資料 <=> String 的正确互換。
9. OutputStreamWriter 和 InputStreamWriter 應該指定編碼格式,避免程式依賴作業系統預設編碼。
10. 使用者從浏覽器端發起一個 HTTP 請求,需要存在編碼的地方是 URL、Cookie、Parameter。伺服器端接受到 HTTP 請求後要解析 HTTP 協定,其中 URI、Cookie 和 POST 表單參數需要解碼,伺服器端可能還需要讀取資料庫中的資料,本地或網絡中其它地方的文本檔案,這些資料都可能存在編碼問題,當 Servlet 處理完所有請求的資料後,需要将這些資料再編碼通過 Socket 發送到使用者請求的浏覽器裡,再經過浏覽器解碼成為文本。
11. tomcat: URL 的 URI 部分進行解碼的字元集是在 connector 的 <Connector URIEncoding=”UTF-8”/>
12. QueryString(GET 查詢參數) 的解碼字元集要麼是 Header 中 ContentType 中定義的 Charset 要麼就是預設的 ISO-8859-1,要使用 ContentType 中定義的編碼就要設定 connector 的 <Connector URIEncoding=”UTF-8” useBodyEncodingForURI=”true”/> 中的 useBodyEncodingForURI 設定為 true。
13. 不要在 Header 中傳遞非 ASCII 字元,如果一定要傳遞的話,我們可以先将這些字元用 org.apache.catalina.util.URLEncoder 編碼然後再添加到 Header 中,這樣在浏覽器到伺服器的傳遞過程中就不會丢失資訊了,如果我們要通路這些項時再按照相應的字元集解碼就好了。
15. HTTP BODY 的編解碼: 當使用者請求的資源已經成功擷取後,這些内容将通過 Response 傳回給用戶端浏覽器,這個過程先要經過編碼再到浏覽器進行解碼。這個過程的編解碼字元集可以通過 response.setCharacterEncoding 來設定,它将會覆寫 request.getCharacterEncoding 的值,并且通過 Header 的 Content-Type 傳回用戶端,浏覽器接受到傳回的 socket 流時将通過 Content-Type 的 charset 來解碼,如果傳回的 HTTP Header 中 Content-Type 沒有設定 charset,那麼浏覽器将根據 Html 的 <meta HTTP-equiv="Content-Type" content="text/html; charset=GBK" /> 中的 charset 來解碼。如果也沒有定義的話,那麼浏覽器将使用預設的編碼來解碼。<%@ page contentType="text/html; charset= GBK" %>。該設定和response.setCharacterEncoding("GBK")等效。
<a></a>