char 是 Java 中表示单个 Unicode BMP 字符的 16 位无符号整数类型,取值范围 0–65535;超出 BMP 的字符(如 emoji)需用代理对表示,应使用 Character.codePointAt() 等 API 安全处理。

char 是 Java 中用于表示单个字符的基本数据类型,它本质上是一个 16 位无符号整数(取值范围 0 到 65535),底层直接对应 Unicode 编码中的基本多文种平面(BMP)字符。
用 char 存储常见单字符
可以直接用单引号括起一个字符来赋值,Java 会自动将其转换为对应的 Unicode 码点:
-
char c1 = 'A';→ 对应 Unicode 码点 U+0041(十进制 65) -
char c2 = '中';→ 对应 U+4E2D(十进制 20013) -
char c3 = '€';→ 对应 U+20AC(十进制 8364)
注意:只要该字符属于 BMP(U+0000 至 U+FFFF),就能用一个 char 完全表示。
处理超出 BMP 的 Unicode 字符(如 emoji、古文字)
Unicode 中部分字符(如大部分 emoji、扩展汉字、音标等)位于辅助平面(U+10000 及以上),无法用单个 char 表示。Java 使用 UTF-16 编码,这类字符需用两个 char 组成的代理对(surrogate pair)来存储:
立即学习“Java免费学习笔记(深入)”;
- 例如:'?'(U+1F600)在 Java 中实际占两个 char:
char high = '\uD83D'; char low = '\uDE00'; - 单独访问其中任一 char 没有意义,必须成对使用才能还原原字符
- 推荐用
String或Character.codePointAt()处理,避免手动拆分
在代码中安全地获取和验证字符编码
不要依赖 char 的数值做逻辑判断(尤其涉及非 ASCII 字符时),而应使用标准 API:
- 获取完整 Unicode 码点:
int cp = Character.codePointAt("?", 0);→ 返回 128512(U+1F600) - 判断是否为有效代理对:
Character.isSurrogatePair(high, low) - 将码点转为字符串:
String str = String.valueOf(Character.toChars(0x1F600)); - 避免写
char c = '?';—— 编译报错,因为该字符超出 char 表示范围
char 与数字、转义序列的互转
char 可以直接与 int 类型隐式/显式转换,常用于底层操作或编码解析:
-
char c = 65;→ 等价于'A'(自动将 int 转为 char) -
int i = '中';→ 得到 20013 - 用 Unicode 转义:
char c = '\u4E2D';→ 同样是 '中' - 十六进制字面量:
char c = 0x4E2D;→ 合法,但不推荐,可读性差
注意:这种转换仅适用于 BMP 内字符;对辅助平面字符,不能用 char 字面量或简单数值赋值。


















