【发布时间】:2012-08-14 08:20:47
【问题描述】:
我有一个程序从 twitter 流 api 实时解析推文。在存储它们之前,我将它们编码为 utf8。某些字符最终会以 ?、?? 或 ??? 出现在字符串中而不是他们各自的unicode代码并导致问题。经过进一步调查,我发现有问题的字符来自"emoticon" block,U+1F600 - U+1F64F,和“杂项Symbols And Pictographs" block,U+1F300 - U+1F5FF。我尝试删除,但没有成功,因为matcher 最终替换了字符串中的几乎每个字符,而不仅仅是我想要的 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(" ");
如何删除这些字符?
【问题讨论】:
-
当你说它不起作用时,你究竟看到了什么行为?而不是使用范围 [\\u1f300-\\u1f64f],您是否尝试使用单个字符并查看是否有效?我怀疑正则表达式范围语法会对 unicode 字符有问题。
-
如果你看到了?在 GUI 组件或 IDE 控制台输出中显示 Unicode 编码的字符串时,而不是 Unicode 字符;不要担心这不是由于 Unicode 编码,而是由于选择了不支持 Unicode 代码点的错误显示字体,如 Latin-1 字体(仅限 255 个代码点)。尝试使用任何支持 Unicode 的字体,例如 Arial Unicode MS
-
抱歉没有具体说明! “不起作用”是指匹配器未找到该字符,或者至少没有将 replaceAll 函数应用于它。谢谢,诶!这是一个好点。但是,我注意到我的输出中有 unicodes(即“u20A2”),而有问题的字符仍然是 ??