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

时间: 2024-10-24 11:56:02

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

一种基于RBAC模型的动态访问控制改进方法

本发明涉及一种基于RBAC模型的动态访问控制改进方法,属于访问控制领域.对原有RBAC模型进行了权限的改进和约束条件的改进,具体为将权限分为静态权限和动态权限,其中静态权限是非工作流的权限,动态权限是工作流中的权限:将约束条件分为静态约束和动态约束,其中静态约束包括最小权限约束和职责分离约束,动态约束使动态权限按照工作流进行操作.采用本发明的方法改进后的RBAC模型具有以下优势:为传统的RBAC模型中增加了动态特性:跟纯动态模型相比较具有更高的效率:保证需要按顺序执行的权限能够按顺序执行,使得系

基于页面染色技术的内存数据库访问优化方法

本发明公开了一种基于页面染色技术的内存数据库访问优化方法.该方法首先将弱局部性数据集的所有数据页面的访问顺序按页面颜色进行排序,并将所有数据页面按页面颜色进行分组,然后按页面颜色分组的顺序扫描弱局部性数据集的所有数据页面.进一步地,预设若干具有相同页面颜色的内存页面作为页面颜色队列,该页面颜色队列用作内存页面被加载入CPU缓存之前的内存缓存:弱局部性数据集的数据页面首先通过异步方式进入页面颜色队列,然后再被加载到CPU缓存中完成数据处理.本发明能够解决内存数据库应用中无法依赖页面颜色为进程.线程

基于 Paraview 扩展与实现——(2)

Paraview程序的架构 Paraview 支持多种数据格式和显示方式,目前包括网格绘制,面绘制,体绘制等方法.若要扩展 Paraview 的功能,必须了解其绘制的固定流水线,并且必须要编写符合 Paraview 接口规范的代码. 可视化包含三个基本的步骤:数据读取,数据过滤和数据渲染.首先,数据需要被读取到可视化应用程序 ParaView 中:接着,根据分析需要选择若干种过滤器来处理这些数据以获得具有某种特定形式的子数据集数据特征.最后,在用户窗口界面中,将这些数据特征以一种形象的和直观的图

守护进程接收终端输入的一种变通性方法

说明 本文主要介绍某嵌入式产品中DSL用户态驱动模块作为守护进程时,如何接收终端输入的变通性方法. 出于信息安全考虑,文中涉及系统方面的接口函数未给出实现细节,但不影响表述的完整性. 相关性文章参见<GNU Readline库函数的应用示例>. 一  背景知识 init进程(如Busybox init)是嵌入式系统内核自举时启动的第一个也是惟一的用户进程.init进程是后续所有其他进程的父进程(其进程ID为1),在系统运行期间以守护进程的形式一直存在.它主要负责启动各运行层次特定的系统服务(如

《机器学习实战》基于信息论的三种决策树算法(ID3,C4.5,CART)

============================================================================================ <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记,包含对其中算法的理解和算法的Python代码实现 另外博主这里有机器学习实战这本书的所有算法源代码和算法所用到的源文件,有需要的留言 如需转载请注明出处,谢谢 ======================================

【EXCEL终极总结分享】基于NPOI扩展封装的简易操作工具类库(简单灵活易用,支持导出、导入、上传等常见操作)

对于EXCEL的导入.导出,我之前已分享过多次,比如: 第一种方案:<我写的一个ExcelHelper通用类,可用于读取或生成数据>这个主要是利用把EXCEL当成一个DB来进行获取数据,导出则是采用拼接成HTML TABLE的方式,这种在ASP.NET,ASP.NET CORE 中也是可以的,简单方便,依赖Office Excel组件,仅适用于网站服务端. 推荐指数:♥♥♥ 第二种方案:<MVC导出数据到EXCEL新方法:将视图或分部视图转换为HTML后再直接返回FileResult&g

三种纯CSS方法实现等高列

在这篇文章里, 我会介绍三种使用纯css的方式来实现等高列的方法.在网页布局中设置列等高是比较常见的, 所以写这篇文章就是要总结下一些优雅的纯CSS解决方案. 插图自己弄得,不喜莫喷 哈哈.. 下面介绍的三种方法都只用到了CSS , 不涉及jQuery.JavaScript计算实现的方法,所以我把它这篇文章标题设为:三种纯CSS方法实现等高列. 方法-1: 使用Margins, Paddings和 Overflow来实现 第一种方法使用margins, paddings和overflow来迫使列

基于 Paraview 扩展与实现——(5)

Checkbox类: 1.实现checkbox的全选功能 <script type="text/javascript"> //全选checkbox:1.当全选checkbox勾选,子checkbox(name为'ids'的checkbox)自动全部勾选 // 2.当全选checkbox取消勾选,子checkbox自动全部取消勾选 function checkAll(){ if($("#checkall")[0].checked){ $("inp

基于Redis的三种分布式爬虫策略

前言: 爬虫是偏IO型的任务,分布式爬虫的实现难度比分布式计算和分布式存储简单得多. 个人以为分布式爬虫需要考虑的点主要有以下几个: 爬虫任务的统一调度 爬虫任务的统一去重 存储问题 速度问题 足够"健壮"的情况下实现起来越简单/方便越好 最好支持"断点续爬"功能 Python分布式爬虫比较常用的应该是scrapy框架加上Redis内存数据库,中间的调度任务等用scrapy-redis模块实现. 此处简单介绍一下基于Redis的三种分布式策略,其实它们之间还是很相似