基于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

目录
相关文章
|
2月前
|
安全 API PHP
PHP中实现CORS跨域资源共享的方法
通过这种方式,你可以在PHP应用中灵活地实现CORS,以支持跨域Web应用的需求。
181 15
|
8月前
|
Ubuntu PHP Apache
在Ubuntu系统中为apt的apache2编译PHP 7.1的方法
以上就是在Ubuntu系统中为apt的apache2编译PHP 7.1的方法。希望这个指南能帮助你成功编译PHP 7.1,并在你的Apache服务器上运行PHP应用。
192 28
|
设计模式 算法 数据库连接
PHP中的设计模式:提高代码的可维护性与扩展性本文旨在探讨PHP中常见的设计模式及其应用,帮助开发者编写出更加灵活、可维护和易于扩展的代码。通过深入浅出的解释和实例演示,我们将了解如何使用设计模式解决实际开发中的问题,并提升代码质量。
在软件开发过程中,设计模式是一套经过验证的解决方案模板,用于处理常见的软件设计问题。PHP作为流行的服务器端脚本语言,也有其特定的设计模式应用。本文将重点介绍几种PHP中常用的设计模式,包括单例模式、工厂模式和策略模式,并通过实际代码示例展示它们的具体用法。同时,我们还将讨论如何在实际项目中合理选择和应用这些设计模式,以提升代码的可维护性和扩展性。
208 4
|
8月前
|
PHP 开发者
PHP数据验证方法:如何检查一个字符串是否是email格式。
以上就是关于PHP如何检查一个字符串是否是email格式的全部内容。希望你在代码书写旅途中,能找到你的北斗星——简洁、高效、可靠的代码验证方式。让我们共同见证PHP的强大和丰富多彩!
214 16
|
9月前
|
SQL 数据库连接 Linux
数据库编程:在PHP环境下使用SQL Server的方法。
看看你吧,就像一个调皮的小丑鱼在一片广阔的数据库海洋中游弋,一路上吞下大小数据如同海中的珍珠。不管有多少难关,只要记住这个流程,剩下的就只是探索未知的乐趣,沉浸在这个充满挑战的数据库海洋中。
214 16
|
JSON PHP 数据格式
PHP解析配置文件的常用方法
INI文件是最常见的配置文件格式之一。
190 12
|
SQL 安全 PHP
PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全
本文深入探讨了PHP开发中防止SQL注入的方法,包括使用参数化查询、对用户输入进行过滤和验证、使用安全的框架和库等,旨在帮助开发者有效应对SQL注入这一常见安全威胁,保障应用安全。
616 4
|
Java PHP 数据安全/隐私保护
PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
本文详细介绍了PHP面向对象编程的一系列核心概念和用法,包括构造函数、析构函数、继承、方法重写、访问控制、接口、抽象类、静态成员、final关键字、以及this、self、parent这三个关键字的异同和作用。通过具体示例代码,展示了如何在PHP中使用这些面向对象的特性,以及它们在实际开发中的应用。
PHP 面向对象,构造函数,析构函数,继承,方法的重写,接口抽象类,static,final,this,parent,self的异同和作用
|
NoSQL 安全 Linux
MongoDB PHP 扩展
10月更文挑战第19天
127 0
MongoDB PHP 扩展
|
设计模式 算法 PHP
PHP中的设计模式:策略模式的深入探索与实践在软件开发的广袤天地中,PHP以其独特的魅力和强大的功能,成为无数开发者手中的得力工具。而在这条充满挑战与机遇的征途上,设计模式犹如一盏明灯,指引着我们穿越代码的迷雾,编写出更加高效、灵活且易于维护的程序。今天,就让我们聚焦于设计模式中的璀璨明珠——策略模式,深入探讨其在PHP中的实现方法及其实际应用价值。
策略模式,这一设计模式的核心在于它为软件设计带来了一种全新的视角和方法。它允许我们在运行时根据不同情况选择最适合的解决方案,从而极大地提高了程序的灵活性和可扩展性。在PHP这门广泛应用的编程语言中,策略模式同样大放异彩,为开发者们提供了丰富的创作空间。本文将从策略模式的基本概念入手,逐步深入到PHP中的实现细节,并通过一个具体的实例来展示其在实际项目中的应用效果。我们还将探讨策略模式的优势以及在实际应用中可能遇到的挑战和解决方案,为PHP开发者提供一份宝贵的参考。