Java9之后内码为什么由UTF-16改为UTF-8

扩展性更强 UTF-8采用可变长度设计,长度为1-6个字节。UTF-16也为可变长设计,长度为2|4字节。UTF-8编码更加灵活和可扩展,能够支持未来出现的新字符和符号。 在之前的Java(9以前)版本中,Java平台采用的是16位Unicode编码(UTF-16)来表示字符和字符串,这种编码方式使用一个或两个16位的code units表示一个Unicode字符。虽然UTF-16编码可以表示所有的Unicode字符,但它并没有完全解决Unicode字符集的扩展问题。如果将来有新的Unicode字符需要添加到字符集中,可能需要修改UTF-16编码方案,从而导致兼容性和可移植性问题。 兼容性更好 UTF-8是一种非常广泛使用的字符编码方案,被支持和应用于众多操作系统、程序和协议中。使用UTF-8作为内部编码,可以更好地与其他系统和组件进行交互,并避免出现兼容性问题。 尽管Java平台之前采用的UTF-16编码也被广泛支持和应用,但在某些情况下,如文本传输和存储等场景,UTF-8编码具有更好的兼容性和互操作性。此外,许多开发人员在编写Java程序时也会使用UTF-8编码,因此将Java平台的内部编码改为UTF-8可以方便开发人员进行文本处理和编程。 更节省空间 相比于UTF-16编码,UTF-8编码在存储英文字符和标点符号等ASCII字符时,只需要使用一个字节,而不是两个字节。这样可以在存储和传输文本数据时节省空间和带宽。在处理大量字符串时可以节省内存使用。 尤其是在存储大量英文字符和标点符号的场景下,UTF-8编码能够显著地减少存储和传输的数据量,提高系统的效率和性能。 提高性能 Java9的String的内部value数组由char数组类型改为byte数字类型。byte占用空间为char的一半,这意味着更多的数据可以缓存在CPU缓存中,从而加速字符串操作的执行速度。

January 9, 2025 · 1 min

Java8一个汉字占几个字节

总结 不同的编码格式占字节数是不同的,UTF-8编码下一个中文所占字节大多常用字是3个字节、少部分是4个字节。UTF-16编码下一个中文所占用字节大多常用字是2个字节,少部分是4字节。 Java存储字节码使用UTF-8节省处理字符串所占用,运行使用UTF-16节省处理字符串时间。 名词解释 字节:byte 字符:char code unit:编码中最小单位,UTF-8中为1字节;UTF-16中为2字节。 code point:Unicode字符集中所对应的唯一编号,即一个文字的唯一编号。 内码(internal encoding):程序内部使用的字符编码,特别是某种语言实现其char或String类型在内存里用的内部编码。 外码(external encoding):程序与外部交互时外部使用的字符编码。“外部”相对“内部”而言;不是char或String在内存里用的内部编码的地方都可以认为是“外部”。例如,外部可以是序列化之后的char或String,或者外部的文件、命令行参数之类的。 编码格式 ASCII 码 128个 ISO-8859-1 256个 GB2312 6763个汉字 GBK 兼容GB2312,能表示2W+汉字 GB18030 使用不广泛 UTF-16 Unicode(Universal Code 统一码):定义文字编码 UTF:定义Unicode在计算机中的转换。 UTF-16:设计之初是定长2个字节,后面变为可变长2|4字节。一个字符(char)用两个字节表示,简化字符串转换操作,提高效率。 UTF-8 采用了一种变长技术,每个编码区域有不同的字码长度。不同类型的字符可以是由 1~6 个字节组成。 编码对应关系 GBK编码 英语字母等需要1个字节,1个汉字对应2个字节。 UTF-16 编码 code unit为2个字节,英语字母等需要2个字节,中文需要2|4字节。 UTF-8 编码 code unit为1个字节,英文等字母需要一个字节,中文变为3|4个字节。 乱码 中文变成了看不懂的字符 例如,字符串“淘!我喜欢!”变成了“Ì Ô £ ¡Î Ò Ï²»¶ £ ¡”。 I/O输出方字符串采用GBK编码成字节数组,I/O接收方收到后对其用ISO-8859-1节码。模拟代码如下。 String str = "淘!我喜欢!"; byte[] gbkBytes = str.getBytes("GBK"); String isoStr = new String(gbkBytes, "ISO-8859-1"); System.out.println(isoStr); 编码过程如下图所示。 ...

January 7, 2025 · 1 min