4

我有一个java.lang.CharSequence. 我需要确定这个实例是否是一个Unicode 标量值序列(即该实例是否为 UTF-16 编码形式)。尽管保证java.lang.String,Java 字符串不一定是 UTF-16 编码形式(至少不是根据最新的Unicode 规范,目前是 6.2),因为它可能包含孤立的代理代码单元。(然而,Java 字符串是Unicode 16 位字符串。)

有几种明显的方法可以解决这个问题,包括:

  1. 迭代序列的代码点,将每个代码点显式验证为 Unicode 标量值。
  2. 使用正则表达式搜索孤立的代理代码点。
  3. 通过报告编码错误的字符集编码器管道传输字符序列。

然而,似乎这样的东西应该已经作为库函数存在。我只是在标准 API 中找不到它。我错过了它,还是我需要实施它?

4

1 回答 1

1

试试这个功能

static boolean isValidUTF16(String s) {
    for (int i = 0; i < s.length(); i++) {
        if (Character.isLowSurrogate(s.charAt(i)) && (i == 0 || !Character.isHighSurrogate(s.charAt(i - 1)))
                || Character.isHighSurrogate(s.charAt(i)) && (i == s.length() -1 || !Character.isLowSurrogate(s.charAt(i + 1)))) {
            return false;
        }
    }
    return true;
}

这是一个测试

public static void main(String args[]) {
    System.out.println(isValidUTF16("\uDC00\uDBFF"));
    System.out.println(isValidUTF16("\uDBFF\uDC00"));
}
于 2013-04-04T11:05:57.047 回答