Emoji表情字元現在在APP已經廣泛支援了。但是Mysql的UTF8編碼對Emoji字元的支援卻不是那麼好。所以我們經常會遇到這樣的異常:
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的版本等等。。
因為我們使用的雲資料庫,所以我選擇了過濾這些特殊字元。其實過濾的方式很簡單,直接使用Regex匹配編碼範圍,然後替換就行了。
下面是My Code。
更多可以參考: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 \uD83C\uDFA6 face\uD860\uDD5D \uD860\uDE07 \uD860\uDEE2 \uD863\uDCCA \uD863\uDCCD \uD863\uDCD2 \uD867\uDD98 "; 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(); } }}