前言
在做一个电商我的项目应用微信领取发动订单付款时,遇到遇到因 商品形容
字段含有 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 编码解码原理