Java 中 Char 占多少字节

前言

我是 Porterxie,一个爱问为什么的程序员。今天要跟大家聊的话题是:Java 中 Char 占多少字节。

其实在学习 Java 基础类型的时候,我们就已经知道 “Char 占用 2 个字节” 这样一个结论。当然,今天想要聊不是这样一个结论,而是想挖一挖 Char 字节占用背后的故事。

分析

上文提到 “Char 占用 2 个字节” 结论。为了准确性,去 Oracle 官网进行了确认,截图如下:
在这里插入图片描述
文档中翻译过来就是:Char 只能表示 UTF-16 单元,即它们仅限于从\u0000到 的值\uffff。因此我们进一步理解下 UTF-16

UTF-16 简介

UTF-16 是 Unicode 的其中一个使用方式。UTF 是 Unicode Transfer Format的缩写,即把 Unicode 转做某种格式的意思。

简单来讲就是 Unicode 是一种字符编码标准,范围现在是 U+0000 到 U+10FFFF(在JDK 8 里面引用的Unicode 编码标准版本是 6.2)。如下图所示:
在这里插入图片描述
而 UTF-16 是编码方式的实现,同样 Unicode 的编码实现方式还有 UTF-8、UTF-32。关于 Unicode 的更多信息可以去 https://home.unicode.org/about-unicode/ 做更多了解。

UTF-16 特点

对于 Unicode 编号范围在 0 ~ FFFF 之间的字符,UTF-16 使用两个字节存储,并且直接存储 Unicode 编号,不用进行编码转换。

对于 Unicode 编号范围在 10000~10FFFF 之间的字符,UTF-16 使用四个字节存储,具体来说就是:将字符编号的所有比特位分成两部分,较高的一些比特位用一个值介于 D800 ~ DBFF 之间的双字节存储,较低的一些比特位(剩下的比特位)用一个值介于 DC00 ~ DFFF 之间的双字节存储 。

到这里相信大家已经明白了为什么 Char 字符是 2 个字节,同时也发现单个 Char 并不能表示所有的 Unicode 的字符,此时可以用到转义序列来表示,如下所示:
在这里插入图片描述
到这里,我们来看如下 Java 代码:

        String chineseCharacter = "好";
        byte[] byteValue = chineseCharacter.getBytes(StandardCharsets.UTF_16);
		System.out.println(byteValue.length);
        System.out.println(HexBin.encode(byteValue));

		String chineseCharacter2 = "好啊";
		byte[] byteValue2 = chineseCharacter2.getBytes(StandardCharsets.UTF_16);
		System.out.println(byteValue2.length);
		System.out.println(HexBin.encode(byteValue2));

		String enCharacter = "a";
		byte[] byteValue3 = enCharacter.getBytes(StandardCharsets.UTF_16);
		System.out.println(byteValue3.length);
		System.out.println(HexBin.encode(byteValue3));

输出结果如下:
在这里插入图片描述
从结果上看,大家肯定是充满疑惑,为什么字符串 a 长度是 4,按照上述分析,2 字节应该就可以表示,中文字符同理。
此处每一个字符串字节数组转 16 进制字符串之后,都有共同的前缀 FEFF。
这个是 UTF-16 的 BOM 信息。因为在编码字节时默认使用 Big Endian,因此前面包含 BOM,以便后续处理器可以知道使用了 Big Endian。如果不想显示的话,可以做如下修改:

        String chineseCharacter = "好";
        byte[] byteValue = chineseCharacter.getBytes(StandardCharsets.UTF_16BE);
		System.out.println(byteValue.length);
    System.out.println(HexBin.encode(byteValue));

		String chineseCharacter2 = "好啊";
		byte[] byteValue2 = chineseCharacter2.getBytes(StandardCharsets.UTF_16BE);
		System.out.println(byteValue2.length);
		System.out.println(HexBin.encode(byteValue2));

		String enCharacter = "a";
		byte[] byteValue3 = enCharacter.getBytes(StandardCharsets.UTF_16BE);
		System.out.println(byteValue3.length);
		System.out.println(HexBin.encode(byteValue3));

输出结果如下:
在这里插入图片描述

参考文档

  • 4
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值