Java中char字节数疑问:String.getBytes()结果为何与预期不符?
问题核心误区:混淆内部存储编码与字节转换编码
你混淆了两个完全不同的概念:Java中char的内部存储编码规则,和getBytes()方法进行字符编码转换时的字节数逻辑。
1. Java中char的内部存储:UTF-16编码
Java的char类型确实占用2字节,因为JVM内部用UTF-16编码存储字符。对于'a'这类ASCII范围内的字符,它们的UTF-16编码是两个字节(比如'a'对应编码值U+0061,UTF-16存储为0x00 0x61),这部分你的理解是正确的。
2. getBytes()方法的本质:编码转换而非直接拷贝
String.getBytes()不是直接把内部char[]的字节原样拷贝出来,而是会将字符串按照平台默认字符编码(通常是UTF-8)转换成字节数组:
- UTF-8编码对ASCII字符采用单字节表示,所以'a'转成UTF-8字节数组后长度为1。
- 如果强制指定UTF-16编码转换,比如调用
test.getBytes(StandardCharsets.UTF_16BE),得到的字节数组长度就是2,和char的内部存储字节数一致。
3. 自定义charToByte方法的逻辑
你写的charToByte方法应该是直接通过位操作读取了char类型的两个原始存储字节(拆分高8位和低8位),这相当于直接提取char的内部存储内容,所以结果长度是2。这和getBytes()的编码转换行为完全不是一回事。
内容的提问来源于stack exchange,提问作者周嘉晔
相关产品推荐
相关产品推荐

