博客 / 詳情

返回

PHP字符串移除emoji字符

前言

在做一個電商項目使用微信支付發起訂單付款時,遇到遇到因商品描述字段含有 emoji 字符微信接口返回字符集超出UTF-8範圍的錯誤提示。
於是特意在網上查找了些解決方案,有通過正則過濾的,也有通過字符集過濾的,經過權衡我最終在項目中採用的是字符集過濾的方案。

正則過濾方案

解決原理是UTF-8編碼長度超過3個字節(一般中文3個字節)的全部替換成空字符串

$str = '平安,喜樂。PA,XL.🍀😀';
$str = preg_replace_callback(
    '/./u',
    function (array $match) {
        return strlen($match[0]) > 4 ? '' : $match[0];
    },
    $str);
echo $str; //平安,喜樂。PA,XL.

字符集過濾方案

先把字符集轉由UTF-8轉成GBK,再由GBK轉成UTF-8,這個過程就會把emoji字符處理掉。

mb_convert_encoding()函數轉換後的emoji會變成?符號,需要另外再剔除。iconv()函數的處理效果能比較符合預期,推薦使用。

$str = '平安,喜樂。PA,XL.🍀😀';
$str = mb_convert_encoding($str, 'GBK', 'UTF-8');
$str = mb_convert_encoding($str, 'UTF-8', 'GBK');
echo $str; //平安,喜樂。PA,XL.??

$str = '平安,喜樂。PA,XL.🍀😀';
$str = iconv('UTF-8', 'GBK//IGNORE', $str);
$str = iconv('GBK', 'UTF-8//IGNORE', $str);
echo $str; //平安,喜樂。PA,XL.

參考

PHP正則模式修飾符
特殊字符(包括emoji)梳理和UTF8編碼解碼原理

user avatar
0 位用戶收藏了這個故事!

發佈 評論

Some HTML is okay.