从Java字符串中删除增补字符

时间:2017-11-13 14:58:35

标签: java string unicode

我有一个包含supplementary characters的Java字符串(Unicode标准中的字符code points are above U+FFFF)。例如,这些角色可以是表情符号。我想从字符串中删除这些字符,即用空字符串替换它们""。

  1. 如何从字符串中删除补充字符?
  2. 如何从任意代码点范围中删除字符? (例如,1F000-1FFFF范围内的所有字符?)

4 个答案:

答案 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.

因此,您需要执行以下操作:

  • 将您的String转换为char [],或使用String.charAt()
  • 执行类似循环条件遍历String中每个字符的操作
  • 检查unicode值是否是您要删除的值。
  • 如果是,请用""。
  • 替换字符

这只是为了让你开始,但如果你还在努力,我可以尝试输入一个完整的例子。

祝你好运!

答案 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();
}
相关问题