• 【转】【异常处理】Incorrect string value: 'xF0x90x8Dx83...' for column... Emoji表情字符过滤的Java实现


    http://blog.csdn.net/shootyou/article/details/44852639

    Emoji表情字符现在在APP已经广泛支持了。但是MySQL的UTF8编码对Emoji字符的支持却不是那么好。所以我们经常会遇到这样的异常:

    [html] view plain copy
     
     print?
    1. 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

    [java] view plain copy
     
     print?
    1. import org.apache.commons.lang3.StringUtils;  
    2.   
    3. public class EmojiFilterUtils {  
    4.   
    5.     /** 
    6.      * 将emoji表情替换成* 
    7.      *  
    8.      * @param source 
    9.      * @return 过滤后的字符串 
    10.      */  
    11.     public static String filterEmoji(String source) {  
    12.         if(StringUtils.isNotBlank(source)){  
    13.             return source.replaceAll("[\ud800\udc00-\udbff\udfff\ud800-\udfff]", "*");  
    14.         }else{  
    15.             return source;  
    16.         }  
    17.     }  
    18.     public static void main(String[] arg ){  
    19.         try{  
    20.             String text = "This is a smiley uD83CuDFA6 faceuD860uDD5D uD860uDE07 uD860uDEE2 uD863uDCCA uD863uDCCD uD863uDCD2 uD867uDD98 ";  
    21.             System.out.println(text);  
    22.             System.out.println(text.length());  
    23.             System.out.println(text.replaceAll("[\ud83c\udc00-\ud83c\udfff]|[\ud83d\udc00-\ud83d\udfff]|[\u2600-\u27ff]", "*"));  
    24.             System.out.println(filterEmoji(text));  
    25.         }catch (Exception ex){  
    26.             ex.printStackTrace();  
    27.         }  
    28.     }  
    29. }  

     

  • 相关阅读:
    如何在某些情况下禁止提交Select下拉框中的默认值或者第一个值(默认选中的就是第一个值啦……)
    渗透测试
    如何制作chrome浏览器插件之一
    linux中的vi命令
    链栈
    二进制转16进制JAVA代码
    抽象数据类型的表示与实现
    变量的引用类型和非引用类型的区别
    说明exit()函数作用的程序
    计算1-1/x+1/x*x
  • 原文地址:https://www.cnblogs.com/hark0623/p/5715437.html
Copyright © 2020-2023  润新知