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.
参考
推荐阅读
Golang 单例模式与sync.Once
在 Golang 中变量或说明实例只初始化一次的效果通过init函数是可以实现的,包在被引入时就会执行一次init函数且无论同一包被引入多少次也都只执行一次。
Jeffid赞 1阅读 1.5k
PHP转Go实践:xjson解析神器「开源工具集」
我和劲仔都是PHP转Go,身边越来越多做PHP的朋友也逐渐在用Go进行重构,重构过程中,会发现php的json解析操作(系列化与反序列化)是真的香,弱类型语言的各种隐式类型转换,很大程度的减低了程序的复杂度。
王中阳Go赞 11阅读 2.7k评论 4
Git操作不规范,战友提刀来相见!
年终奖都没了,还要扣我绩效,门都没有,哈哈。这波骚Git操作我也是第一次用,担心闪了腰,所以不仅做了备份,也做了笔记,分享给大家。问题描述小A和我在同时开发一个功能模块,他在优化之前的代码逻辑,我在开...
王中阳Go赞 6阅读 2.9k评论 4
图片防盗链破解 解决图片防盗链问题 反向代理
当客户端(浏览器)向服务器请求内容的时候,会提交一个header,这个header中包含了如:浏览器信息、cookie等内容,那么有一个叫referer的东东,也包含在这里面。
TANKING赞 7阅读 11.7k评论 5
C 程序眼中的 Unicode
去年写了一篇文章「在 C 程序中处理 UTF-8 字符串」,介绍了如何使用 GLib 提供的 UTF-8 字符串处理函数来实现基本的 UTF-8 文本处理。不过,GLib 是一个功能比较全面的 C 程序库,C 字符串处理仅仅是它的一个很...
garfileo赞 3阅读 5.8k评论 5
Hyperf 3.0 发布,PHP 新时代
在过去的一年半时间里,Hyperf 2.2 共发布了 35 个小版本,使 Hyperf 达到了一个前所未有的高度,这里也获得了一些不错的数据反馈。
huangzhhui赞 4阅读 1.5k评论 1
初学后端,如何做好表结构设计?
这篇文章介绍了设计数据库表结构应该考虑的4个方面,还有优雅设计的6个原则,举了一个例子分享了我的设计思路,为了提高性能我们也要从多方面考虑缓存问题。
王中阳Go赞 3阅读 837评论 2
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。