java - 如何删除 Java 中的代理字符?

标签 java string surrogate-pairs

我面临这样一种情况,我在保存到 MySql 5.1 的文本中得到了代理字符。由于这里不支持 UTF-16,我想在将其保存到数据库之前通过 java 方法手动删除这些代理项对。

我现在已经编写了以下方法,我很想知道是否有直接和最佳的方法来处理这个问题。

预先感谢您的帮助。

public static String removeSurrogates(String query) {
    StringBuffer sb = new StringBuffer();
    for (int i = 0; i < query.length() - 1; i++) {
        char firstChar = query.charAt(i);
        char nextChar = query.charAt(i+1);
        if (Character.isSurrogatePair(firstChar, nextChar) == false) {
            sb.append(firstChar);
        } else {
            i++;
        }
    }
    if (Character.isHighSurrogate(query.charAt(query.length() - 1)) == false
            && Character.isLowSurrogate(query.charAt(query.length() - 1)) == false) {
        sb.append(query.charAt(query.length() - 1));
    }

    return sb.toString();
}

最佳答案

这里有一些事情:

  • Character.isSurrogate(char c) :

    A char value is a surrogate code unit if and only if it is either a low-surrogate code unit or a high-surrogate code unit.

  • 检查对似乎毫无意义,为什么不删除所有代理项呢?

  • x == false 等同于 !x

  • StringBuilder在不需要同步的情况下更好(比如从不离开本地范围的变量)。

我建议这样做:

public static String removeSurrogates(String query) {
    StringBuilder sb = new StringBuilder();
    for (int i = 0; i < query.length(); i++) {
        char c = query.charAt(i);
        // !isSurrogate(c) in Java 7
        if (!(Character.isHighSurrogate(c) || Character.isLowSurrogate(c))) {
            sb.append(firstChar);
        }
    }
    return sb.toString();
}

分解if语句

你问过这个声明:

if (!(Character.isHighSurrogate(c) || Character.isLowSurrogate(c))) {
    sb.append(firstChar);
}

理解它的一种方法是将每个操作分解成它自己的函数,这样您就可以看到组合实现了您所期望的:

static boolean isSurrogate(char c) {
    return Character.isHighSurrogate(c) || Character.isLowSurrogate(c);
}

static boolean isNotSurrogate(char c) {
    return !isSurrogate(c);
}

...

if (isNotSurrogate(c)) {
    sb.append(firstChar);
}

关于java - 如何删除 Java 中的代理字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12867000/

相关文章:

string - Go lang 相当于 JavaScript 的 charCode() 方法

Java 无法打开文件名中包含替代 Unicode 值的文件?

unicode - 实际使用中最常见的非 BMP Unicode 字符有哪些?

javascript - 将所有不匹配的代理对替换为 JavaScript 字符串中的替换字符

java - 当连接数超过池的 maxSize 时,我的 Web 应用程序挂起

java - 在 Java 中删除正则表达式匹配后的部分字符串

java - 在Java中将数字存储到字符串数组中的问题

java - 关于Eclipse的几个问题

java - 推土机映射中的常量

java - Javascript 更新后获取更改后的 HTML 内容? (html单元)