我有一个程序可以从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? á é í ó ú