java中char是16位无符号整数,表示utf-16的码元(code unit),取值0–65535,可直接表示bmp内字符(如'a'、'中'),但增补字符(如?)需用代理对(两个char);string.length()返回char数而非真实字符数,应使用codepointcount等方法正确处理unicode。

Java 中的 char 类型是 16 位无符号整数,专门用于存储单个字符,其本质是 Unicode 码点(code point)在基本多文种平面(BMP,U+0000 到 U+FFFF)内的表示。
char 存储单个字符的方式
每个 char 占用 2 个字节(16 位),取值范围是 0 到 65535(即 0x0000 到 0xFFFF)。它直接对应 Unicode 字符集中的一个码位(code unit),但仅限 BMP 内的字符:
- 例如
'A'对应 Unicode 码点 U+0041,'中'对应 U+4E2D,都可直接用一个char表示; - 声明方式:
char c = 'a';、char c = '\u4F60';(Unicode 转义)、char c = 65;(直接赋整数值); - 注意:必须用单引号,且只能放一个字符(或合法转义序列),写成
'ab'或""会编译报错。
char 与 Unicode 编码的关系
Java 早期设计采用 UTF-16 编码模型,char 是 UTF-16 的基本单位(code unit),但不等同于一个完整的 Unicode 字符(code point):
- BMP 内字符(U+0000–U+FFFF):一个
char就是一个完整字符,如'€'(U+20AC); - 增补字符(Supplementary Characters,U+10000 及以上):如 ?(U+1F602)、?(U+20BB7),需用两个
char表示,称为代理对(surrogate pair)——高位代理(high surrogate, U+D800–U+DBFF)+ 低位代理(low surrogate, U+DC00–U+DFFF); - 因此,
String.length()返回的是char个数,不是真实字符数;处理 emoji 或古汉字时,应使用String.codePointCount(0, str.length())获取实际 Unicode 字符数量。
实际编码操作建议
为避免代理对处理出错,推荐以下安全做法:
- 获取字符:用
str.charAt(i)得到某个char,但要配合Character.isHighSurrogate()和Character.isLowSurrogate()判断是否为代理对; - 遍历字符:优先使用
String.codePoints().forEach(...)或for (int cp : str.codePoints().toArray()),直接按 code point 迭代; - 构造字符:用
Character.toChars(int codePoint)将 Unicode 码点转为char[](可能长度为 1 或 2); - 判断字符类型:用
Character.isLetter(cp)、Character.isDigit(cp)等静态方法,它们支持全部 Unicode 字符(接受int参数)。
Java 的 char 是面向 UTF-16 设计的基石类型,理解它和 Unicode code point、code unit 的区别,是正确处理国际化文本的关键。不复杂但容易忽略细节。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











