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文件指定,資源連接點配置中指定.
不能正常顯示原因通常在兩個地方:字符集;字庫。對於通用的軟件,
一般都提供完整的字庫支持。所以一般問題是解碼不正確。
發佈了28 篇原創文章 · 獲贊 2 · 訪問量 7萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章