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编码解码原理

新世界的开发者;

205 声望
10 粉丝
0 条评论
推荐阅读
Golang 单例模式与sync.Once
在 Golang 中变量或说明实例只初始化一次的效果通过init函数是可以实现的,包在被引入时就会执行一次init函数且无论同一包被引入多少次也都只执行一次。

Jeffid1阅读 1.5k

PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。

王中阳Go11阅读 2.7k评论 4

封面图
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...

王中阳Go6阅读 2.9k评论 4

封面图
图片防盗链破解 解决图片防盗链问题 反向代理
当客户端(浏览器)向服务器请求内容的时候,会提交一个header,这个header中包含了如:浏览器信息、cookie等内容,那么有一个叫referer的东东,也包含在这里面。

TANKING7阅读 11.7k评论 5

C 程序眼中的 Unicode
去年写了一篇文章「在 C 程序中处理 UTF-8 字符串」,介绍了如何使用 GLib 提供的 UTF-8 字符串处理函数来实现基本的 UTF-8 文本处理。不过,GLib 是一个功能比较全面的 C 程序库,C 字符串处理仅仅是它的一个很...

garfileo3阅读 5.8k评论 5

Hyperf 3.0 发布,PHP 新时代
在过去的一年半时间里,Hyperf 2.2 共发布了 35 个小版本,使 Hyperf 达到了一个前所未有的高度,这里也获得了一些不错的数据反馈。

huangzhhui4阅读 1.5k评论 1

封面图
初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。

王中阳Go3阅读 837评论 2

封面图

新世界的开发者;

205 声望
10 粉丝
宣传栏