用戶輸入了emoji表情,提交的時候因爲後端沒有存儲相應的emoji字符編碼,導致報錯異常。
原因: unicode定義的emoji是四個字符,對於一些之前沒有考慮過emoji表情的系統來說,其獲取或者展示簡直就是災難。公司用的MySQL,其utf8字符集最多支持三個字符。
解決方案
- 改變MySQL編碼集設置,比如將其編碼從utf8轉換成utf8mb4
- 前端直接過濾掉emoji,可以用正則實現
正則一:
regemoRule : /\uD83C[\uDF00-\uDFFF]|\uD83D[\uDC00-\uDE4F]/g, // 表情匹配正則
正則二:
function replaceEmoji (val) {
var regStr = /[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF][\u200D|\uFE0F]|[\uD83C|\uD83D|\uD83E][\uDC00-\uDFFF]|[0-9|*|#]\uFE0F\u20E3|[0-9|#]\u20E3|[\u203C-\u3299]\uFE0F\u200D|[\u203C-\u3299]\uFE0F|[\u2122-\u2B55]|\u303D|[\A9|\AE]\u3030|\uA9|\uAE|\u3030/ig;
var value = val;
value = unescape(escape(value).replace(/\%uD.{3}/g, ''))
return value;
};
以上兩種正則方案都是線上採用的方式。