Character.isHighSurrogate用于判断char是否为U+D800至U+DBFF范围内的高代理项,即UTF-16中补充字符代理对的前半部分,仅对0xD800–0xDBFF返回true,不验证后续低代理项是否存在。

Character.isHighSurrogate 用于判断一个 char 值是否为 Unicode 中的**高代理项(high surrogate)**,即位于 U+D800 到 U+DBFF 范围内的 16 位代码单元。它不判断字符本身是否是补充字符(supplementary character),而是专门识别 UTF-16 编码中用来表示补充字符的**前半部分**。
什么是高代理项?
Unicode 中编号大于 U+FFFF 的字符(即码点 ≥ 0x10000)称为补充字符,无法用单个 char(16 位)表示,需用两个 char 组成的代理对(surrogate pair):一个高代理项 + 一个低代理项。
高代理项固定落在 U+D800–U+DBFF(十进制 55296–56319)范围内。
isHighSurrogate 的行为特点
该方法只接收 char 类型参数(即 0x0000–0xFFFF),因此:
- 输入值在 0xD800–0xDBFF 之间 → 返回
true - 输入值在 0xDC00–0xDFFF(低代理项范围)或其它值 → 返回
false - 不会抛出异常,也不检查是否真的构成有效代理对(比如后面有没有匹配的低代理项)
典型使用场景
常用于遍历字符串时跳过代理对的首字节,避免把高代理项当作独立字符处理:
String s = "??"; // 补充字符,UTF-16 编码为两个 char:0xD83D 0xDC48
for (int i = 0; i < s.length(); i++) {
char c = s.charAt(i);
if (Character.isHighSurrogate(c)) {
// 下一个 char 应该是低代理项,可组合成一个码点
if (i + 1 < s.length() && Character.isLowSurrogate(s.charAt(i + 1))) {
int cp = Character.toCodePoint(c, s.charAt(i + 1));
System.out.println("补充字符码点:" + String.format("U+%04X", cp));
i++; // 跳过下一个 char
}
} else if (!Character.isLowSurrogate(c)) {
// 普通 BMP 字符
System.out.println("BMP 字符:" + String.format("U+%04X", (int) c));
}
}
常见误区提醒
注意以下几点,避免误用:
立即学习“Java免费学习笔记(深入)”;
- 不能用它直接判断某个字符串是否含补充字符——需结合
Character.isLowSurrogate和Character.toCodePoint - 单独一个高代理项若没有配对的低代理项,属于非法 UTF-16 序列,但
isHighSurrogate仍返回true - 不要对
int码点(如 0x1F4BB)调用此方法——它只接受char,超出范围会自动截断,结果不可靠


















