当前位置:科普知识站>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;    }