java的char类型可直接存储bmp内中文字符(如'中'),但超bmp字符需代理对;单引号限一个代码单元,双引号为string类型不兼容。

Java 的 char 类型能直接存储绝大多数中文字符,关键在于理解它存的是 Unicode 码点(不是字节流),且默认按 UTF-16 编码规则在内存中布局。正确存储和输出不只靠“能写出来”,更需注意编码一致性、边界字符处理和 I/O 时的显式指定。
用 char 存一个中文:必须是单引号 + BMP 内汉字
常见汉字如“中”“你”“好”都在基本多语言平面(BMP,U+0000–U+FFFF),可直接用单个 char 存储:
-
char c = '中';合法 —— 编译器自动将源文件中的“中”解码为码点 U+4E2D(十进制 20013),存入 2 字节 -
char c = "中";报错 —— 双引号是String,类型不兼容 -
char c = '你好';报错 —— 单引号内只允许一个 Unicode 代码单元(code unit) -
char c = '\u4E2D';等价于'中'—— Unicode 转义在编译期解析,适合避免源文件编码风险
超 BMP 字符(如 emoji 或生僻字)不能用单个 char
码点 ≥ U+10000 的字符(如 ? U+1F30D、? U+1FAD6)超出 16 位范围,Java 用代理对(surrogate pair)表示,占两个 char(共 4 字节):
-
String s = "?";→s.length()返回 2,但真实字符数是 1 - 判断真实字符数要用
s.codePointCount(0, s.length()) - 遍历时别用
for (int i = 0; i 直接取 <code>s.charAt(i),可能拆开代理对;应改用codePoints()流或offsetByCodePoints
输出中文时,重点不在 char,而在 String 和编码设置
char 是内存中的逻辑单元,输出到控制台、文件或网络时,实际走的是 String 的字节序列,必须明确编码:
- 打印到控制台:
System.out.println("你好")通常没问题(依赖终端编码,但现代 IDE/系统多为 UTF-8) - 写入文件:必须显式指定编码,例如:
Files.write(Paths.get("a.txt"), "你好".getBytes(StandardCharsets.UTF_8)); - 从字节数组构造字符串:
new String(bytes, StandardCharsets.UTF_8)—— 若误用ISO-8859-1,中文会变乱码 - 读文件时同理:
Files.readString(path, StandardCharsets.UTF_8)
常见踩坑提醒
这些细节看似小,却常导致乱码或逻辑错误:
-
char相加(如'a' + 'b')结果是int(195),不是新字符 —— 拼接请用String或StringBuilder -
String不可变,所有修改操作(replace、substring等)都返回新对象 - 比较字符串内容必须用
.equals(),不用== - 源文件保存编码要与编译器预期一致(推荐统一用 UTF-8),否则
'中'可能被错误解码
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











