用微信公众号开发举例,我们获取用户信息并且储存进数据库的时候,微信昵称由于可以使用emoji表情,utf-8编码可能2个字节、3个字节、4个字节的字符,但是MySQL的utf8编码只支持3字节的数据,而移动端的表情数据是4个字节的字符。如果直接往采用utf-8编码的数据库中插入表情数据,Java程序中将报SQL异常:
java.sql.SQLException: Incorrect string value: ‘\xF0\x9F\x92\x94’ for column ‘name’ at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3593)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3525)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1986)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2140)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2620)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1662)
at com.mysql.jdbc.StatementImpl.executeUpdate(StatementImpl.java:1581)
虽然对数据库进行了一定配置修改,有时候还是会报一样的错误,查原因应该是由于手机系统不一样导致emoji表情编码不一样导致的这个问题,也可能是我没配置好的原因吧。
总而言之,这种方法不是特别推荐。
我个人推荐使用emoji-java去过滤这些emoji表情,maven配置如下
<dependency> <groupId>com.vdurmont</groupId> <artifactId>emoji-java</artifactId> <version>4.0.0</version> </dependency>
使用方法也非常简单,使用maven下载之后,在存储用户昵称的时候,使用如下方法过滤即可:
EmojiParser.removeAllEmojis(String wechatNickName)