當前位置:科普知識站>IT科技>

java|charset

IT科技 閱讀(2.41W)

<link rel="stylesheet" href="https://js.how234.com/third-party/SyntaxHighlighter/shCoreDefault.css" type="text/css" /><script type="text/javascript" src="https://js.how234.com/third-party/SyntaxHighlighter/shCore.js"></script><script type="text/javascript"> SyntaxHighlighter.all(); </script>

java charset是什麼,讓我們一起了解一下?

Charset類是在java.nio.charset包中,它繼承了Comparable接口,還有CharsetDecoder、CharsetEncoder編碼和解碼的類,都是繼承Object類。

Java中的字元使用Unicode編碼,每個字元佔用兩個字節,16個二進制位,向ByteBuffer中存放數據的時候需要考慮字元的編碼,從中讀取的時候也需要考慮字元的編碼方式,也就是編碼和解碼。

我們都知道,Java中char類型是16位無符號基本數據類型,用來存儲Unicode字元。字元數據類型的範圍爲0到65535,可以存儲65536個不同的Unicode字元,這在起初Unicode字元集不是很大的時候,是沒問題的。

然而隨着Unicode字元集的增長,已經超過65536個了,根據Unicode標準,現在Unicode代碼點的合法範圍是U+0000到U+10FFFF,U+0000到U+FFFF稱爲Basic Multilingual Plane(BMP),代碼點大於U+FFFF的字元稱爲增補字元。

java charset

Java如何解決這個問題的呢?

Java的char類型使用UTF-16編碼描述一個代碼單元。在這種表現形式下,增補字元用一對代碼單元編碼,即2個char,其中,第一個值取值自uD800-uDBFF(高代理項範圍),第二個值取值自uDC00-uDFFF(低代理項範圍)。Unicode規定,U+D800到U+DFFF的值不對應於任何字元,爲代理區。因此,UTF-16利用保留下來的0xD800-0xDFFF區段的碼位來對增補字元進行編碼。

另外,在Java裏,如果沒有指定Charset的時候,比如new String(byte[] bytes),都會調用Charset.defaultCharset()的方法,該字元集默認跟操作系統字元集一致,也可以透過-Dfile.encoding=叉叉叉來手動設定,這個方法的具體實現如下:

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;    }