java中char类型能直接存储绝大多数常用汉字,因其本质是存储unicode基本多语言平面(bmp)内码点的16位无符号整数,固定占2字节;例如‘中’对应码点u+4e2d(十进制20013),以二进制0100111000101101存入内存,不保存utf-8或gbk等原始字节。

Java 中的 char 类型能直接存储绝大多数常用汉字,但它的本质不是“存汉字”,而是存 Unicode 码点在基本多语言平面(BMP)内的 16 位整数值——固定占 2 字节。
char 存的是码点,不是字节
当你写 char c = '中';,编译器会把源文件中这个汉字按指定编码(如 UTF-8)解码,查出它在 Unicode 中的码点 U+4E2D(十进制 20013),再把这个数字以 16 位二进制形式存入内存。它不保存原始 UTF-8 的三个字节,也不管 GBK 的两个字节,只存这个整数。
- ‘中’ → U+4E2D → 十进制 20013 → 二进制 0100111000101101(刚好 16 位)
- 等价写法:
char c = '\u4E2D';,编译期就解析为同一数值 - 源文件编码(如
UTF-8)只影响编译时读取,运行时内存中全是 Unicode 码点值
哪些汉字能用单个 char 安全表示
只要汉字 Unicode 码点 ≤ 0xFFFF(即在 BMP 平面内),就能用一个 char 完整表示。几乎所有常用汉字都属于这一范围:
Java Maven 项目审查工作流的通用输入处理。当 Java Maven 项目以 ZIP压缩包或 GitLab 仓库 URL 形式提供且需要...时使用。
- CJK 统一汉字区:U+4E00–U+9FFF(如“一”U+4E00、“你”U+4F60、“好”U+597D)
- 扩展 A 区:U+3400–U+4DBF(如“?”U+2A6A5?不对,这个已超 BMP;但多数扩展 A 字仍在 BMP 内)
- 验证方法:
Character.isBmpCodePoint(c)或Character.codePointAt("字", 0)
哪些汉字不能用单个 char
Unicode 后续扩展的辅助平面字符(码点 ≥ U+10000),比如:
- 部分生僻古汉字:U+30000、U+31000 等
- 较新 emoji:? U+1F305、? U+1F938、? U+1FAD6
- 它们在 Java 中必须拆成两个
char:一个高位代理(0xD800–0xDBFF)+ 一个低位代理(0xDC00–0xDFFF) - 看似一个字符,
String.length()返回 2;真实字符数要用String.codePointCount(0, s.length())
转义与外部交互要注意的事
用 \uXXXX 写中文可避免源文件编码问题,但它是编译期行为,不能拼接生成;而和外部打交道时,char 本身不负责编码转换:
- 写文件:
"中".getBytes(StandardCharsets.UTF_8)—— 显式指定 UTF-8,别依赖默认 - 读字节:
new String(bytes, StandardCharsets.UTF_8)—— 必须用相同编码还原 - 误用
ISO-8859-1解中文,会得到无意义的char值(因该编码无中文定义) -
char相加自动提升为int,如'中' + '文'得到的是数字和,不是字符串
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










