Java字符集轉換解釋

Java字符集轉換解釋

Java系統內的字符以雙字節存儲,採用unicode(utf-16之一)編碼。(估計jdk後續版本的java字符編碼可能提升爲4字節,這樣可徹底解決東方國家字庫問題。)
Utf-8是一種標準存儲編碼格式,用utf-8編碼後的字節流具有非常好的防(糾)錯和兼容能力。用utf-8編碼(encode)unicode碼時不會有信息損失。當然用utf-8解碼(decode)utf-8編碼的字節流,生成unicode碼時也不會有信息損失。但禁止用utf-8解碼非utf-8編碼的字節流。總之Utf-8可以編碼任何unicode 碼,但只能解碼utf-8編碼的字節流。
Utf-16和utf-8用法是一樣的,僅是一點不同:utf-16是雙字節倍數編碼,utf-8是單字節倍數編碼,在英文國家裏用utf-8和ascii編碼後的字節流是一樣的,這樣有利於系統平穩升級到支持utf-8的系統裏,但系統要升級到支持utf-16就要把所有數據都更新一遍,這顯然不能接受。注意:utf-16根據字節排序不同有兩種編碼

Iso8859-1是西方國家頻繁使用的字符編碼格式。用iso8859-1編碼unicode碼中的東方字庫部分的字符時統統編碼成??,也就是說:用iso8859-1編碼unicode碼時信息會有損失。但用iso8859-1解碼任意(iso8859-1編碼的和非iso8859-1編碼的)字符流時,信息不會有損失,這是因爲一個字節中的所有256個字符對iso8859-1都是合法的都是合法的。有時候在一些linux操作系統和一些應用服務器裏,默認的解碼方式是iso8859-1,這是大多數亂碼的原因。
Gb18030,gbk,gb2312是漢字字符的編碼格式,用gb18030(gbk,gb2312和gb18030是同一系列,不過字庫要小,但使用方式是一樣的,這裏不區分,統統用gb18030)編碼unicode碼時非中英文的字符會被編碼爲?,也就是說,用gb18030只能編碼unicode中的中英文字符,其他的字符都會被損失掉。同樣用gb18030解碼只能解碼gb18030編碼的字符流。
Xml文件中 是告訴瀏覽器要用要用指定的編碼格式解碼自身這個文件,當然要求瀏覽器首先要支持這個編碼格式(在客戶端),jsp頁面的字符集是告訴jsp服務器要用要用指定的編碼格式解碼自身這個jsp文件(在服務器段). 然而在servlet程序中response.setContentType("text/html; charset=GBK");是告訴servlet程序用指定編碼格式編碼(在服務器段)
字符集轉換的基本思想很簡單,用某種字符編碼規則編碼,就用什麼編碼規則解碼,經常出問題的深層次原因是java對字節流未提供編碼信息,可以認爲這是一個嚴重的失誤。估計未來的java能提供這樣的信息。…待續
涉及編碼問題的地方有:java類文件編輯時,java類文件編譯時,實施文件,服務器指定,jsp文件內指定,xml(html)內指定,servlet文件指定,資源連接點配置中指定.
不能正常顯示原因通常在兩個地方:字符集;字庫。對於通用的軟件,一般都提供完整的字庫支持。所以一般問題是解碼不正確。
術語:
字符集:字符編碼集
編碼格式:字符編碼的規格,可大致視爲和字符集是同一回事,其實還是有區分的
編碼:encode
解碼:decode
每個軟件系統內部都只使用1種字符碼來表示內存中數據,如java使用unicode來表示。
但由於unicode碼的數據沒有糾錯能力,所以在用文件或數據庫來存放數據時很少直接採用。
utf-8及utf-16是從爲unicode碼提供糾錯能力這個目的發展起來的。由於utf-8和過去的ascii兼容,所以utf-8成爲主流用於存儲unicode碼的轉換編碼方式。utf-8及utf-16不是一種編碼,僅僅是一種編碼轉換規則而已。
gbk(gb2312,gb18030)是遵循unicode而制定的用於漢字編碼的unicode碼。
iso8859-1是西歐文字編碼。用完了一個字節的所有256個代碼。
在java系統裏,內存中的數據必須用unicode編碼,所以讀取各種存儲設備的數據時,都需要先根據存儲設備中的數據的編碼規則進行解碼讀取;存儲數據時,需要根據存儲設備要求的編碼規則進行編碼存儲。所以在java內存中以unicode爲中介,可以在各種編碼規則之間來回自由轉換。


lazet
[email protected]

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章