从 UTF-8 格式的字符串中提取双字节 Characters/substring
Extracting Double Byte Characters/substring from a UTF-8 formatted String
我正在尝试从字符串中提取表情符号和其他特殊字符以进行进一步处理(例如,字符串包含“”作为其字符之一)。
但是 string.charAt(i)
和 string.substring(i, i+1)
都不适合我。原始字符串采用 UTF-8 格式,这意味着上述表情符号的转义形式被编码为“\uD83D\uDE05”。这就是为什么我收到 '?' (\uD83D) 和 '?' (\uDE05) 而不是这个位置,导致它在迭代字符串时位于两个位置。
有人能解决这个问题吗?
感谢 John Kugelman 的帮助。解决方案现在看起来像这样:
for(int codePoint : codePoints(string)) {
char[] chars = Character.toChars(codePoint);
System.out.println(codePoint + " : " + String.copyValueOf(chars));
}
使用 codePoints(String string)-方法如下所示:
private static Iterable<Integer> codePoints(final String string) {
return new Iterable<Integer>() {
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
int nextIndex = 0;
public boolean hasNext() {
return nextIndex < string.length();
}
public Integer next() {
int result = string.codePointAt(nextIndex);
nextIndex += Character.charCount(result);
return result;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}
我正在尝试从字符串中提取表情符号和其他特殊字符以进行进一步处理(例如,字符串包含“”作为其字符之一)。
但是 string.charAt(i)
和 string.substring(i, i+1)
都不适合我。原始字符串采用 UTF-8 格式,这意味着上述表情符号的转义形式被编码为“\uD83D\uDE05”。这就是为什么我收到 '?' (\uD83D) 和 '?' (\uDE05) 而不是这个位置,导致它在迭代字符串时位于两个位置。
有人能解决这个问题吗?
感谢 John Kugelman 的帮助。解决方案现在看起来像这样:
for(int codePoint : codePoints(string)) {
char[] chars = Character.toChars(codePoint);
System.out.println(codePoint + " : " + String.copyValueOf(chars));
}
使用 codePoints(String string)-方法如下所示:
private static Iterable<Integer> codePoints(final String string) {
return new Iterable<Integer>() {
public Iterator<Integer> iterator() {
return new Iterator<Integer>() {
int nextIndex = 0;
public boolean hasNext() {
return nextIndex < string.length();
}
public Integer next() {
int result = string.codePointAt(nextIndex);
nextIndex += Character.charCount(result);
return result;
}
public void remove() {
throw new UnsupportedOperationException();
}
};
}
};
}