总结
豆包 AI 助手文章总结

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

php中文网
发布: 2016-06-13 12:22:05
原创
1178人浏览过

基于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-pathmakemake 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 uggubb: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 uggstr:This is test(CSDN Emoji不能展示用XXXX代替)<span style="font-size: 13.6000003814697px; line-height: inherit; background-color: transparent;"> by ugg</span>
登录后复制

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 [email protected] for all questions

登录后复制
PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载
来源:php中文网
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
最新问题
豆包 AI 助手文章总结
开源免费商场系统广告
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号