【轉】【異常處理】Incorrect string value: '\xF0\x90\x8D\x83...' 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: '\xF0\x90\x8D\x83...' 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 \uD83C\uDFA6 face\uD860\uDD5D \uD860\uDE07 \uD860\uDEE2 \uD863\uDCCA \uD863\uDCCD \uD863\uDCD2 \uD867\uDD98 ";  
  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. }  

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM