Character.toChars()是将Unicode码点转为UTF-16 char数组的推荐方式,能正确处理BMP内字符(返回1个char)和增补字符(返回代理对)。

Java 中 Character.toChars() 是将 Unicode 码点(int 类型,范围 U+0000 到 U+10FFFF)转换为对应的 UTF-16 编码的 char 数组的推荐方式。它能正确处理增补字符(即码点 ≥ 0x10000 的字符),自动拆分为高代理项(surrogate high)和低代理项(surrogate low)两个 char。
理解码点与 char 的关系
Java 的 char 是 16 位无符号类型,只能表示基本多文种平面(BMP)内的字符(U+0000–U+FFFF)。超出此范围的字符(如大部分 emoji、古文字、数学符号等)需用两个 char 表示:一个高代理项(0xD800–0xDBFF)加一个低代理项(0xDC00–0xDFFF),合称代理对(surrogate pair)。Character.toChars(int codePoint) 会根据输入码点自动返回长度为 1 或 2 的 char[]:
- 若
codePoint ∈ [0x0000, 0xFFFF]且不为代理项(即不在 0xD800–0xDFFF),返回单元素数组:{ (char)codePoint } - 若
codePoint ∈ [0x10000, 0x10FFFF],返回两个元素的数组:{ highSurrogate, lowSurrogate } - 其他值(如负数、超限、代理项本身)抛出
IllegalArgumentException
基本用法示例
直接调用静态方法即可:
// 示例:普通 ASCII 字符
char[] chars1 = Character.toChars(0x0041); // 'A'<br> // → chars1.length == 1, chars1[0] == 'A'
// 示例:增补字符(如 ? U+1F30D)
char[] chars2 = Character.toChars(0x1F30D); // 地球 emoji<br> // → chars2.length == 2<br> // chars2[0] == 0xD83C, chars2[1] == 0xDF0D
// 示例:中文「?」U+20BB7(超出 BMP)
char[] chars3 = Character.toChars(0x20BB7);<br> // → length == 2, valid surrogate pair
安全使用注意事项
避免常见误用:
立即学习“Java免费学习笔记(深入)”;
-
不要手动拆分码点:别用位运算自己算高低代理项,容易出错;交给
toChars()处理 -
校验输入码点:虽然方法内部会检查,但建议提前用
Character.isValidCodePoint(int)判断,便于统一错误处理 - 注意返回数组是新对象:每次调用都新建数组,不可复用;如需频繁转换,考虑缓存或批量处理
-
与 String 构造配合使用:常用于构造含增补字符的字符串:
new String(Character.toChars(0x1F30D))
替代方案对比
其他方式存在局限性:
-
(char)codePoint:仅适用于 BMP 内字符,对增补字符会截断高位,结果错误 -
String.valueOf(codePoint):返回String,内部其实也调用了toChars(),如需char[]再调.toCharArray()多一次拷贝 -
Character.toChars(int, char[], int)重载版本:支持写入指定数组和偏移量,适合高性能场景或复用缓冲区


















