java中char是16位utf-16代码单元而非unicode字符,处理东亚文本需以code point为单位,结合代理对、正确编码和字节序意识。

Java中char类型是16位无符号整数(0到65535),对应UTF-16编码的基本代码单元(BMP字符),但无法直接表示Unicode中超出BMP的字符(如部分汉字古字、 emoji、少数民族文字等)。处理东亚多语言字符集时,不能简单把char当作“一个字符”,而需结合UTF-16代理对(surrogate pair)机制理解其2字节本质。
理解char不是“字符”,而是UTF-16代码单元
Java的char仅表示一个UTF-16代码单元,而非逻辑上的Unicode字符(code point)。例如:
- 常见汉字如“汉”(U+6C49)在BMP内,可用单个char表示;
- 而扩展区汉字如“?”(U+20000)属于增补平面(SMP),需用两个char组成代理对:高位代理(0xD840) + 低位代理(0xDC00);
- String.length()返回的是char数量,不是字符数——含代理对的字符串长度会比实际字符数多1。
安全遍历字符串:避免按char索引切分
直接用for(int i=0; i 从文件或网络读取东亚文本(如GBK、Shift-JIS、UTF-8)时,char的2字节特性不自动解决编码问题。关键在于: 若需将char[]写入二进制协议或文件,需明确字节序: 真正可靠的东亚字符处理,核心不在char的2字节大小,而在始终以Unicode code point为语义单位,并严格区分编码层(byte ↔ char)、表示层(char ↔ code point)和逻辑层(用户感知的“字”)。
解码输入流时指定正确编码,不依赖char隐式转换
序列化与传输:注意char数组与UTF-16BE/LE的映射
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











