java - 如何验证 CharSequence 的实例是否是 Unicode 标量值序列?

标签 java unicode utf-16 charsequence surrogate-pairs

我有一个 java.lang.CharSequence 实例。我需要确定这个实例是否是 Unicode scalar values 的序列(即实例是否为UTF-16编码形式)。尽管有 java.lang.String 的保证,Java 字符串不一定是 UTF-16 编码形式(至少根据最新的 Unicode specification,目前是 6.2),因为它可能包含孤立的surrogate code units . (然而,Java 字符串是 Unicode 16-bit string。)

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

  1. 遍历 code points序列,明确验证每个作为 Unicode 标量值。
  2. 使用正则表达式搜索孤立的代理代码点。
  3. 通过 character-set encoder 传递字符序列那reports encoding errors .

不过,看起来像这样的东西应该已经作为一个库函数存在了。我只是在标准 API 中找不到它。我是否遗漏了它,或者我是否需要实现它?

最佳答案

试试这个功能

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"));
}

关于java - 如何验证 CharSequence 的实例是否是 Unicode 标量值序列?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15808892/

相关文章:

java - 使用 Google Directions API 在 Android 应用程序中获取驾驶说明

wpf - 如何在 XAML 中放入 unicode 字符?

javascript - 如何在 Javascript 中打印文字 unicode 字符串?

unicode - 将 UTF-16 视为固定的 16 位编码会带来什么问题?

windows - UTF-16 到 UTF-8 的转换(用于在 Windows 中编写脚本)

java - 在 Spring 中将请求参数/路径变量映射到 GET 请求中的 Dto

java - 在 Android 中通过 Intent 使用 Zxing 扫描条码时如何更改文本?

jquery - 为什么 JQuery 只显示包含在其他标签中的 HTML 字符?

java.text.Collat​​or 用于字符串比较。,

java - 如何减少部分冲洗