

新闻资讯
行业动态Java中char是16位UTF-16编码单元,可表示BMP字符(如'中'),但辅助平面字符(如?)需代理对;操作字符串应使用codePointCount、codePoints等API而非charAt/length。
Java 中的 char 是16位无符号整数类型,用于表示单个 Unicode 字符,底层采用 UTF-16 编码规则。它不是 ASCII 的简单扩展,而是能表达更广泛字符(包括中文、emoji、数学符号等)的基础类型。
char 在 JVM 内部占 2 字节(0x0000 ~ 0xFFFF),对应一个 UTF-16 编码单元(code unit)。注意:它不等于“一个字符(character)”——某些 Unicode 字符(如大部分 emoji 或古汉字)需要两个 char(即一个代理对,surrogate pair)才能完整表示。
char 表示,例如 'A'、'中'、'€'
char 组成代理对,例如 ?(U+1F30D)→ '\uD83C' + '\uDF0D'
char c = '中';、char c = '\u4F26';(Unicode 转义)、char c = 20013;(十进制码点值)用 String 处理字符时,不能简单依赖 charAt() 或 length() 来统计“字符个数”,因为它
们操作的是 char 单元,而非逻辑字符(grapheme cluster)。
"?".length() 返回 2(两个 char),但实际是 1 个字符string.codePointCount(0, string.length())
string.codePoints().forEach(...) 或手动配合 Character.isHighSurrogate()/isLowSurrogate()
(char) codePoint;否则需拆为代理对,推荐用 Character.toChars(codePoint) 返回 char[]
开发中容易忽略 char 的 UTF-16 特性,导致乱码或越界问题。
立即学习“Java免费学习笔记(深入)”;
char 当作“字节”:它永远是 2 字节,和文件编码(如 UTF-8)无关;读写文本时应使用 InputStreamReader/OutputStreamWriter 指定 charsetchar 和 int:如 'a' + 1 结果是 98(int 类型),不是 'b';要转回 char 需显式强转:(char)('a' + 1)
String.substring() 可能切开代理对,造成无效字符;建议用 String.offsetByCodePoints() 定位char 序列化为 JSON 字符串时,会自动转义非 ASCII 字符(如 "\u4F26"),无需手动处理快速验证和调试 char 相关逻辑:
System.out.printf("U+%04X%n", (int)'中');
Character.isSurrogate(c)、Character.isHighSurrogate(c)
str.codePoints().mapToObj(Integer::toHexString).forEach(System.out::println);
str.substring(0, str.offsetByCodePoints(0, N));