UTF-16 与UTF-8的区别? 为什么字段串长度不使用UTF-8?

​​深度解析:Java字符串长度与编码机制的底层逻辑


背景:
字符串长度与 ISO-8859-1 字节长度一致
  1. ​​log.length() 返回的是 ​​UTF-16 代码单元数量​​(每个字符通常占 1 个单元)。
  2. 由于 ISO-8859-1 的替换策略,每个 Unicode 字符(无论是否支持)最终映射为 ​​1 字节​​,因此字节数恰好等于字符串长度。

一、字符串长度与编码的核心矛盾点

​1. log.length()的本质​
Java的String.length()方法返回的是字符串中​​UTF-16代码单元的数量​​,而非字符的实际字节数。例如:

String str = "你好"; // 两个中文字符(UTF-16代码单元数为2)
System.out.println(str.length()); // 输出2

这里的length()计算的是UTF-16代理对的数量,而非物理字节长度(实际在UTF-8中占6字节)。

​2. ISO-8859-1的特殊性​
当使用ISO-8859-1编码时,每个Unicode字符会被强制降级为​​单字节​​(无法表示的字符替换为0x3F问号)。此时字符串的字节长度可能与length()返回值一致,但需满足以下条件:

  • 所有字符均能被ISO-8859-1表示(如纯ASCII字符)
  • 无法表示的字符被替换为问号(如中文"你好"转换为"??"length()=2,字节数=2)。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值