java中char是16位无符号整数,取值范围为0到65535,严格对应unicode基本多语言平面(bmp)码点;超出该范围需用utf-16代理对表示辅助平面字符。

Java 中的 char 不是“字符图形”,而是一个**16 位无符号整数**,取值严格限定在 0 到 65535(含),对应 Unicode 基本多语言平面(BMP)的全部码点。掌握这个范围,关键在于理解它的数值本质、编码边界和实际映射逻辑。
char 就是数字:0–65535 是硬性上限
Java 规定 char 占固定 2 字节,无符号,因此最大能表示 2¹⁶ = 65536 个不同值,从 0 开始编号 → 最大为 65535。超出这个值就会编译报错或运行时截断:
-
char c = 65536;→ 编译失败(常量超出范围) -
char c = (char)65536;→ 实际得到'\u0000'(高位被丢弃,只保留低 16 位) -
char c = -1;→ 编译失败(不能赋负值给无符号类型)
Unicode BMP 码点一一对应
0–65535 这个区间,直接映射到 Unicode 的基本多语言平面(U+0000 到 U+FFFF)。每个整数就是一个合法的 BMP 字符编码:
-
char c = 65;→'A'(U+0041) -
char c = 20013;→'中'(U+4E2D) -
char c = '\u0000';→ 空字符(U+0000) -
char c = '\uffff';→ U+FFFF(一个定义的控制字符,非常用可见字)
注意:不是所有 0–65535 的码点都有“可见字符”,有些是控制符、保留区或未分配码位,但它们仍是合法的 char 值。
别把 char 当“单个字”用:BMP 外字符需代理对
Unicode 已扩展到 17 个平面(U+0000–U+10FFFF),但 char 只能覆盖第一个平面(BMP)。像 ?(U+1F30D)、?(U+20000)这类辅助平面字符,**无法用单个 char 表示**,必须用两个 char 组成 UTF-16 代理对:
-
"?".length()返回 2(不是 1) -
"?".charAt(0)得到高代理(如'\uD83C'),charAt(1)得到低代理(如'\uDF0D') - 正确获取字符数量要用
String.codePointCount(0, str.length()) - 遍历应使用
String.codePoints().forEach(...)或手动处理代理对
实用验证与调试技巧
日常开发中可快速验证 char 范围和映射关系:
- 打印某个 char 的 Unicode 值:
System.out.printf("'%c' → U+%04X%n", ch, (int)ch); - 检查是否在 BMP 内:
if (ch >= 0 && ch (恒成立,因 char 本身已限定) - 安全转 int:
int code = (int)ch;—— 不会丢失信息(char 到 int 是拓宽转换) - 反向转换要谨慎:
char c = (char)someInt;前务必确保someInt∈ [0, 65535],否则结果不可预期
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











