关于php: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编码解码原理

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理