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字符】PHP正则模式修饰符
特殊字符(包括emoji)梳理和UTF8编码解码原理
推荐阅读
- 利用钉钉内网穿透上传php项目时遇到的问题
- Java|Java面向对象题库
- 浅谈vue|浅谈vue 移动端完美适配方案
- php|php yield rest,ES6数组扩展运算符(Rest+Spread)、类方法、原型方法
- javascript|ES6新特性(上)——let及const、解构赋值、模板字符串、Symbol
- JavaScript|ES6新特性总结(2)解构赋值、模板字符串、Symbol
- #|ES6基础学习——第一天(let 声明、const 声明、解构赋值、模板字符串(反引号)、简化对象写法、箭头函数、参数默认值、rest 参数、spread 扩展运算符)
- 前端必备知识|ES6学习笔记(4)——字符串\正则\数值\数组\函数\对象的扩展
- nginx|nginx php中文乱码,Zabbix-web的中文显示及其乱码问题解决方法
- Linux|I.MX6ULL学习笔记(二)—uboot移植