Java中Unicode字符集和UTF8,UTF16编码

Unicode和UTF16

Unicode是字符集,但是Unicode不规定如何存储,即到底几个字节为一组对应一个字符;
UTF16是Unicode字符集的一种编码方式,通过”提示位“标识几个字节编为一组,这样就可以实现字符的存储和读取了;
位于 D800~0xDFFF 之间的 Unicode 编码是特别为四字节的 UTF-16 编码预留的,所以不应该在这个范围内指定任何字符。如果你真的去查看 Unicode 字符集,会发现这个区间内确实没有收录任何字符。
基本转换步骤如下:
将代码点减去 0x10000,仅保留低 20 位;
将高 10 位加上 0xD800,得到高代理;
将低 10 位加上 0xDC00,得到低代理;

Java程序内部使用UTF16编码

Java程序在内存中使用UTF16编码转换字符为数字进行存储,所以char类型可以隐式转换为int;

int n = '你';
System.out.println(n);
// 20320
System.out.println(Integer.toHexString(n));
// 4f60
System.out.println("u4f60");
// 你

但随着unicode字符数量增加,2字节已经不够了,所以char类型16位长度无法表示所有字符,很多字符需要用两个char来表示

UTF8编码

编码方式指的是如何将字符转化为字节,同时将字节转化为字符;
UTF8也是一种,将Ascii码字符转为1个字节,将汉字转为3个字节,通常存储和传输用的比较多。

Java的getBytes()

Bytes是8位整数,getBytes()即将字符通过UTF16编码为数字然后拆成8位Byte字节数组,Bytes是有符号的,所以会有负数。

 for (Byte b:"你".getBytes()) {
     System.out.println(b);
 }
 // -28
 // -67
 // -96
原文地址:https://www.cnblogs.com/Peter2014/p/12715448.html