如何在Java中处理字符串时避免Twitter表情符号字符

4

我正在处理来自Twitter的推文,并将它们存储在数据库(MySQL)中。

我的处理过程已经完美运行,但有时我会遇到像这样的错误:

2012-08-31 08:11:23,303 WARN org.hibernate.engine.jdbc.spi.SqlExceptionHelper  - SQL Error: 1366, SQLState: HY000
2012-08-31 08:11:23,304 ERROR org.hibernate.engine.jdbc.spi.SqlExceptionHelper  - Incorrect string value: '\xF0\x9F\x98\x9D #...' for column 'twe_text' at row 1

在查找我的日志中的有问题的推文时,我发现了以下内容:

 2012-08-31 08:11:22,971 INFO com.myapp.TweetLoaderJob  - Text for tweet 241175722096480256: RT @totallytoyosi_: My go
odies, my goodies, not your goodies  <U+1F61D> #m&ms #sweeties #goodies #food  @ The Ritzy Cinema Café, Brixton htt ...

最后,查明了这神马是什么鬼,发现它是Twitter原封不动地发送的一个表情符号。点击此处可以查看相关信息。
我进行了调试,只查找了特定推文,但我的Eclipse似乎无法识别这种编码字符。那么问题来了,我该如何处理这个异常?我查找了如何配置MySQL数据库,但是我不允许更改编码(这是一个要求),所以我的选择是避免处理这种推文或删除这个复杂的字符。
但如果Java不能识别它,怎么办呢?
1个回答

1

在将字符串存储到数据库之前,您可以使用简单的正则表达式(例如<U+[^>]+>)过滤字符串并删除不需要的部分。


我刚刚尝试了一下,但是它不起作用... 我猜<U+1F61D>是编码,而不是接收到的文本。 - Alex_ES
1
我刚发现这个代码:s = s.replaceAll("[^\\x00-\\x7f]", "");。这对你有用吗? - m4573r
1
最终,我用一个不太正规的解决方法解决了这个问题(但它以相同的方式解决了问题,只是设置了一个问号而不是那个表情符号):new String(status.getText().getBytes("ISO-8859-1")); - Alex_ES
我测试了你的解决方案@m4573r。它工作得很好,但我会失去像_£_这样的字符。你在哪里找到那个正则表达式?也许我可以再精确一点... - Alex_ES
从SO上的一个类似问题中,我想肯定可以修改要过滤掉的字符范围。 - m4573r
3
昨天用这个正则表达式解决了问题:[^\\x00-\\x7f-\\x80-\\xad]。谢谢! - Alex_ES

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接