http://blog.csdn.net/shootyou/article/details/44852639
Emoji表情字符现在在APP已经广泛支持了。但是MySQL的UTF8编码对Emoji字符的支持却不是那么好。所以我们经常会遇到这样的异常:
- Incorrect string value: 'xF0x90x8Dx83...' for column
原因是Mysql里UTF8编码最多只能支持3个字节,而Emoji表情字符使用的UTF8编码,很多都是4个字节,有些甚至是6个字节。
解决的方案有两种:
1.使用utf8mb4的mysql编码来容纳这些字符。
2.过滤掉这些特殊的表情字符。
关于第一种解决方法,请参考:http://segmentfault.com/a/1190000000616820 和 http://info.michael-simons.eu/2013/01/21/Java-mysql-and-multi-byte-utf-8-support/
有大量细节需要注意,例如:mysql版本,mysql的配置,mysql connector的版本等等。。
因为我们使用的云数据库,所以我选择了过滤这些特殊字符。其实过滤的方式很简单,直接使用正则表达式匹配编码范围,然后替换就行了。
下面是我的代码。
更多可以参考:http://stackoverflow.com/questions/27820971/why-a-surrogate-java-regexp-finds-hypen-minus
- import org.apache.commons.lang3.StringUtils;
- public class EmojiFilterUtils {
- /**
- * 将emoji表情替换成*
- *
- * @param source
- * @return 过滤后的字符串
- */
- public static String filterEmoji(String source) {
- if(StringUtils.isNotBlank(source)){
- return source.replaceAll("[\ud800\udc00-\udbff\udfff\ud800-\udfff]", "*");
- }else{
- return source;
- }
- }
- public static void main(String[] arg ){
- try{
- String text = "This is a smiley uD83CuDFA6 faceuD860uDD5D uD860uDE07 uD860uDEE2 uD863uDCCA uD863uDCCD uD863uDCD2 uD867uDD98 ";
- System.out.println(text);
- System.out.println(text.length());
- System.out.println(text.replaceAll("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]", "*"));
- System.out.println(filterEmoji(text));
- }catch (Exception ex){
- ex.printStackTrace();
- }
- }
- }