开发者社区> aizher8860> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

基于PHP扩展一种处理Emoji方法的类库介绍【Carmela】

简介:
+关注继续查看

Carmela介绍

Carmela提供基于PHP,PHP扩展,JAVA,C++等语言的一套处理4四节UTF-8解决方案,比如常见Emoji标签支持

背景:

UTF-8格式含有Emoji表情字符串直接插入数据库,如果数据库未做调整会提示报错,通过更改数据库和表的字符集为utf8mb4_general_ci,可以避免这种问题。但是,在很多大型系统和架构中,修改数据库的字符集可能会引发很多的问题,比如PC端展示,新老数据兼容问题。针对这类问题,还有另外一种解决方案,入库前替换,出库后根据客户端类型做反向替换。

Carmela

Carmela提供基于PHP扩展一套处理4四节UTF-8解决方案,可以把UTF-8中大于3个字节的UTF-8字符替换成ubb模式,比如某UTF-8字符%f0%9f%91%a4(为了展示方便,展示emoji标签的encode模式),替换后的样子[u]1f464[/u],同时从数据库读出时,根据不同的请求客户端(iOS,Andriod,PC)做反向替换。 Carmela的名字来源《不一样的卡梅拉》,《不一样的卡梅拉》系列故事讲的是母鸡卡梅拉和她的儿女们卡梅利多和卡门的历险故事,卡梅拉家族里的每个人都是那样的与众不同,敢于幻想,更敢于去尝试别人不敢想的事情。

安装

1.编译打包

git clone https://github.com/ugg/Carmela
<php-bin>/phpize
./configure  --with-php-config=<php-path>/php-config-path
make
make install
  1. 修改配置文件

    vim /php.ini

添加以下内容

[carmela] 
extension=carmela.so

方法:

carmela_str2ubb: 包含emoji标签的字符串转换成ubb模式,替换后的样子[u]1f464[/u]。

一个例子:

$str = urldecode("This is test %F0%9F%98%9C+%F0%9F%98%99 by ugg");
echo "str:".$str."\n";
echo "ubb:".carmela_str2ubb($str)."\n";

输出结果:

str:This is test xxxx(CSDN Emoji不能展示用XXXX代替) by ugg
ubb:This is test [u]1f61c[/u] [u]1f619[/u] by ugg

carmela_ubb2str:包含ubb标签转换为utf-8字符串格式,针对PC平台的转移,可以参考encode.class.php中的carmela_ubb2str方法。

一个例子:

$str = urldecode("This is test %F0%9F%98%9C+%F0%9F%98%99 by ugg");
$str = carmela_str2ubb($str);
echo "ubb:".$str."\n";
echo "str:".carmela_ubb2str($str)."\n";

输出结果:

ubb:This is test [u]1f61c[/u] [u]1f619[/u] by ugg
str:This is test(CSDN Emoji不能展示用XXXX代替) by ugg

carmela_substr:

截取包含emoji字符的字符串指定长度字符。

carmela_sububb:

截取包含ubb标签的字符串的指定长度字符。

carmela_delstr:

删除字符串中的emoji字符,非严格模式,3字节的emoji字符无法删除,主要用在一些。

carmela_delubb:

删除包含ubb标签字符串中的ubb标签。

性能

使用PHP分别实现了两种方法,分别使用PHP的str_replace方法和PHP查找四字节emoji,进行替换的方法,以及PHP扩展方式,使用相同数据分别进行测试,测试效果如下。

=========================== 方案1:PHP str_replace方式 =========================
=========== EMOJI TO STRING ==========
TIME:781.94ms,处理行数: 100,处理字数:10100,处理字节数:31028
平均每行处理时间:7.819ms
=========== STRING TO EMOJI ==========
TIME:118.566ms,处理行数: 100,处理字数:18710,处理字节数:37793
平均每行处理时间:1.186ms
=========================== 方案2:PHP字符查找方式 =========================
=========== EMOJI TO STRING ==========
TIME:51.526ms,处理行数: 100,处理字数:10100,处理字节数:31028
平均每行处理时间:0.515ms
=========== STRING TO EMOJI ==========
TIME:27.959ms,处理行数: 100,处理字数:23092,处理字节数:41236
平均每行处理时间:0.28ms
=========================== 方案3:PHP扩展方式 =========================
=========== EMOJI TO STRING ==========
TIME:0.721ms,处理行数: 100,处理字数:10100,处理字节数:31028
平均每行处理时间:0.007ms
=========== STRING TO EMOJI ==========
TIME:0.956ms,处理行数: 100,处理字数:20308,处理字节数:38452
平均每行处理时间:0.01ms

从以上测试效果上来看,str_replace方式,性能非常的差。使用PHP直接编写替换函数方式,性能提升10倍多,而采用扩展方式后,性能提升明显,在把emoji从字符形式转换为ubb方式时,性能提升1000倍。

以上测试数据通过create_file.php可以动态生成。本测试用例,生成100行数据,每行100个字符,100字符中可以包含3-10个emoji字符,进行测试的,直接运行benchmark.php 查看运行性能。

原理

处理四字节的emoji原理非常简单,通过字符对比找到emoji字符进行替换。难点就是在基本原理上如何提升性能,如何快速查找,替换。PHP扩展方式,为大家提供了一种思路,可以参考这种思路实现java,C#,js等等版本的。

PC如何支持EMoji表情展示?

在项目目录中的emoji目录下找到images目录,从web根目录创建emoji文件夹,把images文件夹整个拷贝到emoji文件下,调用encode.class.php里面的carmela_ubb2str方法,

Util_Encode::carmela_ubb2str($str, "PC");

即可在PC上展示Emoji表情,目前收集到的845个emoji表情,一些新的表情符号并没有纳入其中,当然,目前这种方法并没有写入PHP扩展中,性能相对来说并不高。

Contact ugg.xchj@gmail.com for all questions

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Android后台杀死系列之一:FragmentActivity及PhoneWindow后台杀死处理机制(二)
Android后台杀死系列之一:FragmentActivity及PhoneWindow后台杀死处理机制(二)
28 0
PHP file_get_contents函数读取远程数据超时的解决方法
PHP file_get_contents函数读取远程数据超时的解决方法 投稿:junjie 字体:[增加 减小] 类型:转载   这篇文章主要介绍了PHP file_get_contents函数读取远程数据超时的解决方法,本文直接给出解决方法代码,需要的朋友可以参考下     在网络状况比较差的情况下file_get_contents函数经常读取远程数据失败。
847 0
帝国cms调用最新文章 利用文字调用标签phomenews
  最近建站时,朋友要求在头部用帝国cms调用最新文章,当时想了用灵动标签调用,但需要设置一个具体的栏目id,这样就不是调用全站的最新文章了,后面查看了一下标签说明,想到了文字调用标签phomenews。
1311 0
PHP获取图片宽度高度、大小尺寸、图片类型、用于布局的img属性
//php自带函数 getimagesize()$img_info = getimagesize('tomener.jpg'); echo ''; print_r($img_info); 输出: Array ( [0] => 170 [1] => 254 [2] => 2 [3] => w...
869 0
C#基础知识回顾--BackgroundWorker介绍
简介 BackgroundWorker是.net里用来执行多线程任务的控件,它允许编程者在一个单独的线程上执行一些操作。耗时的操作(如下载和数据库事务)在长时间运行时可能会导致用户界面 (UI) 始终处于停止响应状态。
766 0
+关注
aizher8860
10年互联网老兵
106
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载