我有一个程序可以从Twitter流API实时解析推文。在存储它们之前,我将它们编码为utf8。某些字符最终以?,??或???出现在字符串中而不是它们各自的unicode代码,并且会引起问题。经过进一步调查,我发现有问题的字符来自"emoticon" block,U + 1F600-U + 1F64F和“其他Symbols And Pictographs" block,U + 1F300-U + 1F5FF。我尝试删除,但由于匹配器最终替换失败而未能成功字符串中几乎每个字符,而不仅仅是我想要的unicode范围。

String utf8tweet = "";
        try {
            byte[] utf8Bytes = status.getText().getBytes("UTF-8");

            utf8tweet = new String(utf8Bytes, "UTF-8");

        }
        catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
Pattern unicodeOutliers = Pattern.compile("[\\u1f300-\\u1f64f]", Pattern.UNICODE_CASE | Pattern.CANON_EQ | Pattern.CASE_INSENSITIVE);
Matcher unicodeOutlierMatcher = unicodeOutliers.matcher(utf8tweet);
utf8tweet = unicodeOutlierMatcher.replaceAll(" ");

如何删除这些字符?

最佳答案

在正则表达式模式中,添加否定运算符^。为了过滤可打印的字符,您可以使用以下表达式[^\\x00-\\x7F],您应该获得所需的结果。

import java.io.UnsupportedEncodingException;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UTF8 {
    public static void main(String[] args) {
        String utf8tweet = "";
        try {
            byte[] utf8Bytes = "#Hello twitter  How are you?".getBytes("UTF-8");

            utf8tweet = new String(utf8Bytes, "UTF-8");

        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
        }
        Pattern unicodeOutliers = Pattern.compile("[^\\x00-\\x7F]",
                Pattern.UNICODE_CASE | Pattern.CANON_EQ
                        | Pattern.CASE_INSENSITIVE);
        Matcher unicodeOutlierMatcher = unicodeOutliers.matcher(utf8tweet);

        System.out.println("Before: " + utf8tweet);
        utf8tweet = unicodeOutlierMatcher.replaceAll(" ");
        System.out.println("After: " + utf8tweet);
    }
}

结果如下:
Before: #Hello twitter  How are you?
After: #Hello twitter   How are you?

编辑

为了进一步说明,您还可以继续使用\u格式以以下方式表示范围:[^\\u0000-\\u007F],它将匹配不是前128个UNICODE字符的所有字符(与以前相同)。如果要扩展范围以支持其他字符,则可以使用UNICODE字符列表here进行扩展。

例如,如果要包括带有重音的元音(在西类牙语中使用),则应将范围扩展到\u00FF,这样就可以得到[^\\u0000-\\u00FF][^\\x00-\\xFF]:
Before: #Hello twitter  How are you? á é í ó ú
After: #Hello twitter   How are you? á é í ó ú

07-24 09:37
查看更多