Java中打印UTF字符的for循环未终止问题排查
问题原因
核心问题在于你使用了char类型作为循环变量:
- Java的
char是16位无符号整数,取值范围仅为0~65535,对应Unicode基本多语言平面(U+0000到U+FFFF)的字符。 - 当
i(char类型)递增到65535后,执行i++会触发溢出,数值重置为0。此时循环条件i <= 90000看似成立,但超出65535的码点无法用单个char表示,输出的字符会变成无效的代理对或无法显示的符号,导致你误以为循环提前终止。 - 你目标的90000对应的Unicode码点是U+15F90,早已超出
char的表示范围,单个char根本无法存储这个字符。
修复后的代码
将循环变量改为int类型,并用Character.toChars()处理多码点字符的转换:
for(int i = 20488; i <= 90000; i++) { System.out.print(i + " = "); System.out.println(Character.toChars(i)); }
额外说明
- Unicode码点的完整范围是0~1114111(0x10FFFF),
int类型可以完全覆盖这个区间,适合用来遍历所有Unicode字符。 - 如果直接用
(char)i强制转换超出65535的码点,会丢失高位数据,得到错误的字符。
内容的提问来源于stack exchange,提问作者CodeRattlesnake
相关产品推荐
相关产品推荐

