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.9k

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

王中阳Go4阅读 1.8k评论 2

封面图
记录一个关于 GBK 编码的问题
UTF-8 是一种国际化的编码方式,包含了世界上大部分的语种文字(简体中文字、繁体中文字、英文、日文、韩文等语言),也兼容 ASCII 码。

编程码农5阅读 2k

一分钟搞明白!快速掌握 Go WebAssembly
最近因为各种奇怪的原因,更多的接触到了 WebAssembly。虽然之前很多博客也翻过写过各种文章,但总感觉欠些味道。于是今天梳理了一版,和大家一起展开学习。

煎鱼4阅读 2.3k

Laravel入门及实践,快速上手ThinkSNS+二次开发
【摘要】自从ThinkSNS+不使用ThinkPHP框架而使用Laravel框架之后,很多人都说技术门槛抬高了,其实你与TS+的距离仅仅只是学习一个新框架而已,所以,我们今天来说说Laravel的入门。

ThinkSNS1阅读 2.5k

悬赏任务源码+开源威客系统网站源码+部署教程
威客悬赏任务发布系统源码是用来进行日常在线任务接单处理的威客系统。系统可以用来发布或处理悬赏任务,甚至可以知道一个帐户的信息,如任务类型和处理状态等,它们很方便,易于使用,它允许雇主和威客执行快速...

火爆的筷子1阅读 3.8k评论 1

我让chatGPT用PHP写一个MVC框架,不仅写出来,还能跑!
没想到写出来的框架确实挺简单的,但是又没觉得哪里不对,于是我尝试把这个框架放到服务器试试能不能跑起来,最后还真的可以跑起来,为了让大家能够看到这个框架的演示,我直接爬一个热搜,然后便于展示数据。

TANKING1阅读 1.7k

封面图

新世界的开发者;

205 声望
10 粉丝
宣传栏