深度解析:Java字符串长度与编码机制的底层逻辑
背景:
字符串长度与 ISO-8859-1 字节长度一致
-
log.length() 返回的是 UTF-16 代码单元数量(每个字符通常占 1 个单元)。
-
由于 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)。


1936

被折叠的 条评论
为什么被折叠?



