我面临这样一种情况,我在保存到 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/