java charset是什么,讓我們一起了解一下?
Charset類是在java.nio.charset包中,它繼承了Comparable接口,還有CharsetDecoder、CharsetEncoder編碼和解碼的類,都是繼承Object類。
Java中的字符使用Unicode編碼,每個字符占用兩個字節(jié),16個二進制位,向ByteBuffer中存放數(shù)據(jù)的時候需要考慮字符的編碼,從中讀取的時候也需要考慮字符的編碼方式,也就是編碼和解碼。
我們都知道,Java中char類型是16位無符號基本數(shù)據(jù)類型,用來存儲Unicode字符。字符數(shù)據(jù)類型的范圍為0到65535,可以存儲65536個不同的Unicode字符,這在起初Unicode字符集不是很大的時候,是沒問題的。
然而隨著Unicode字符集的增長,已經(jīng)超過65536個了,根據(jù)Unicode標準,現(xiàn)在Unicode代碼點的合法范圍是U+0000到U+10FFFF,U+0000到U+FFFF稱為Basic Multilingual Plane(BMP),代碼點大于U+FFFF的字符稱為增補字符。
Java如何解決這個問題的呢?
Java的char類型使用UTF-16編碼描述一個代碼單元。在這種表現(xiàn)形式下,增補字符用一對代碼單元編碼,即2個char,其中,第一個值取值自\uD800-\uDBFF(高代理項范圍),第二個值取值自\uDC00-\uDFFF(低代理項范圍)。Unicode規(guī)定,U+D800到U+DFFF的值不對應于任何字符,為代理區(qū)。因此,UTF-16利用保留下來的0xD800-0xDFFF區(qū)段的碼位來對增補字符進行編碼。
另外,在Java里,如果沒有指定Charset的時候,比如new String(byte[] bytes),都會調(diào)用Charset.defaultCharset()的方法,該字符集默認跟操作系統(tǒng)字符集一致,也可以通過-Dfile.encoding=叉叉叉來手動設(shè)定,這個方法的具體實現(xiàn)如下:
public?static?Charset?defaultCharset()?{ ????????if?(defaultCharset?==?null)?{ ????synchronized?(Charset.class)?{ java.security.PrivilegedAction?pa?= ????new?GetPropertyAction("file.encoding"); String?csn?=?(String)AccessController.doPrivileged(pa); Charset?cs?=?lookup(csn); if?(cs?!=?null) ????defaultCharset?=?cs; ????????????????else? ????defaultCharset?=?forName("UTF-8"); ????????????} } return?defaultCharset; ????}
以上就是小編今天的分享了,希望可以幫助到大家。