character.tochars()用于将unicode码点转为utf-16字符数组:码点≤0xffff时返回长度1数组,≥0x10000时返回含高低代理的长度2数组,无效码点返回空数组,不抛异常且线程安全。

Character.toChars 是 Java 中用于将一个 Unicode 码点(int 类型,范围 0x000000 到 0x10FFFF)转换为对应的 UTF-16 编码字符数组的方法。它处理的是**代理对(surrogate pair)**:当码点大于 0xFFFF(即超出基本多文种平面 BMP),无法用单个 char 表示时,该方法会返回长度为 2 的数组,包含高代理和低代理字符;否则返回长度为 1 的数组。
返回值特点
该方法总是返回一个新创建的 char[],长度为 1 或 2:
- 码点 ∈ [0x0000, 0xFFFF] → 返回
new char[]{ (char) codePoint } - 码点 ∈ [0x10000, 0x10FFFF] → 返回
new char[]{ highSurrogate, lowSurrogate } - 码点无效(如
0xD800–0xDFFF或 >0x10FFFF)→ 返回空数组new char[0]
与 String 构造方式的区别
不要混淆 Character.toChars(int) 和 String.valueOf(int):
-
Character.toChars(0x1F600)→{ '\uD83D', '\uDE00' }(两个 char) -
String.valueOf(0x1F600)→ 字符串"0"(把数字 128512 当作 int 打印成字符串) - 正确构造字符串应使用
new String(Character.toChars(0x1F600))或String.codePointAt()相关 API
典型使用场景
常见于需要手动处理 Unicode 字符边界、解析 emoji、实现自定义文本迭代器等底层操作:
- 遍历字符串中每个逻辑字符(而非每个
char)时,先用String.codePointAt()获取码点,再用toChars还原为对应 UTF-16 序列 - 序列化/反序列化码点数据时,确保能准确还原为 Java 可用的字符表示
- 避免直接操作
char数组导致代理对被错误拆分(例如str.charAt(i)可能只取到高代理)
这个方法不修改原数据,也不抛异常,行为确定且轻量,适合在性能敏感路径中安全调用。










