我有一个包含supplementary characters的Java字符串(Unicode标准中的字符code points are above U+FFFF)。例如,这些角色可以是表情符号。我想从字符串中删除这些字符,即用空字符串替换它们""。
答案 0 :(得分:4)
有几种方法。由于正则表达式替换是昂贵的,可能会这样做:
String basic(String s) {
StringBuilder sb = new StringBuilder();
for (char ch : s.toCharArray()) {
if (!Character.isLowSurrogate(ch) && !Character.isHighSurrogate(ch)) {
sb.append(ch);
}
}
return sb.length() == s.length() ? s : sb.toString();
}
答案 1 :(得分:0)
You can get a character's unicode value by simply converting it to an int.
因此,您需要执行以下操作:
这只是为了让你开始,但如果你还在努力,我可以尝试输入一个完整的例子。
祝你好运!答案 2 :(得分:0)
这是一个代码片段,用于收集代码点60和100之间的字符:
public class Test {
public static void main(String[] args) {
new Test().go();
}
private void go() {
String s = "ABC12三○";
String ret = "";
for (int i = 0; i < s.length(); i++) {
System.out.println(s.codePointAt(i));
if ((s.codePointAt(i) > 60) & (s.codePointAt(i) < 100)) {
ret += s.substring(i, i+1);
}
}
System.out.println(ret);
}
}
结果:
code point: 65
code point: 66
code point: 67
code point: 49
code point: 50
code point: 19977
code point: 65518
result: ABC
希望这有帮助。
答案 3 :(得分:0)
Java字符串是UTF-16编码的。 String
类型具有codePointAt()
方法,用于在给定的char
(codeunit)索引处检索已解码的代码点。
所以,你可以这样做,例如:
String removeSupplementaryChars(String s)
{
int len = s.length();
if (len == 0)
return "";
StringBuilder sb = new StringBuilder(len);
int i = 0;
do
{
if (s.codePointAt(i) <= 0xFFFF)
sb.append(s.charAt[i]);
i = s.offsetByCodePoints(i, 1);
}
while (i < len);
return sb.toString();
}
或者这个:
String removeCodepointsinRange(String s, int lower, int upper)
{
int len = s.length();
if (len == 0)
return "";
StringBuilder sb = new StringBuilder(len);
int i = 0;
do
{
int cp = s.codePointAt(i);
if ((cp < lower) || (cp > upper))
sb.appendCodePoint(cp);
i = s.offsetByCodePoints(i, 1);
}
while (i < len);
return sb.toString();
}