ホームページ >バックエンド開発 >PHPチュートリアル >PHPベースで絵文字を扱うメソッドを拡張するクラスライブラリの紹介 [Carmela]
絵文字を処理するための PHP 拡張機能ベースのクラス ライブラリの紹介 [Carmela]
Carmela は、PHP、PHP 拡張機能、JAVA、 C およびその他の言語。一般的な絵文字タグなど、4 つのセクションからなる UTF-8 ソリューションの処理セット。
UTF-8 形式。データベースが調整されていない場合、文字列がデータベースに直接挿入されると、エラーが報告されます。この問題は、データベースとテーブルの文字セットを utf8mb4_general_ci に変更することで回避できます。しかし、多くの大規模なシステムやアーキテクチャでは、データベースの文字セットを変更すると、PC 側の表示や新旧データ間の互換性の問題など、多くの問題が発生する可能性があります。この種の問題に対しては、データベースに入る前に置換し、データベースから出た後にクライアントの種類に応じて逆置換を行うという別の解決策もあります。
Carmela は、PHP 拡張機能に基づいて 4 セクション UTF-8 を処理するソリューションを提供します。これにより、UTF-8 の 3 バイトを超える UTF-8 文字を UBB モードに置き換えることができます。特定の UTF-8 文字 👤 (表示の便宜上、絵文字タグのエンコード モードが表示されています)、[u]1f464[/u] の置換後、同時にデータベースから読み取るとどのように表示されるか、さまざまなリクエストクライアント (iOS、Android、PC) に応じて、逆置換を実行します。カルメラという名前は、「異なるカルメラ」に由来しています。「異なるカルメラ」シリーズの物語は、雌鶏のカルメラとその子供たち、カルメリドとカルメンの冒険物語です。他の人が思いつかないようなことに挑戦すること。
1. コンパイルとパッケージ化
<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; padding: 0px; margin: 0px; border-radius: 3px; word-break: normal; border: 0px; display: inline; max-width: initial; overflow: initial; line-height: inherit; word-wrap: normal; background: transparent;">git clone https://github.com/ugg/Carmela<php-bin>/phpize./configure --with-php-config=<php-path>/php-config-pathmakemake install</code>
設定ファイルを変更します
vim /php.ini
添加以下内容
<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; padding: 0px; margin: 0px; border-radius: 3px; word-break: normal; border: 0px; display: inline; max-width: initial; overflow: initial; line-height: inherit; word-wrap: normal; background: transparent;">[carmela] extension=carmela.so</code>
<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; padding: 0px; margin: 0px; border-radius: 3px; word-break: normal; border: 0px; display: inline; max-width: initial; overflow: initial; line-height: inherit; word-wrap: normal; background: transparent;">$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";</code>
<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; padding: 0px; margin: 0px; border-radius: 3px; word-break: normal; border: 0px; display: inline; max-width: initial; overflow: initial; line-height: inherit; word-wrap: normal; background: transparent;">str:This is test xxxx(CSDN Emoji不能展示用XXXX代替) by uggubb:This is test [u]1f61c[/u] [u]1f619[/u] by ugg</code>
<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; padding: 0px; margin: 0px; border-radius: 3px; word-break: normal; border: 0px; display: inline; max-width: initial; overflow: initial; line-height: inherit; word-wrap: normal; background: transparent;">$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";</code>
<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; padding: 0px; margin: 0px; border-radius: 3px; word-break: normal; border: 0px; display: inline; max-width: initial; overflow: initial; line-height: inherit; word-wrap: normal; background: transparent;">ubb:This is test [u]1f61c[/u] [u]1f619[/u] by uggstr:This is test</code><code style="font-size: 13.6000003814697px; line-height: inherit; box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; padding: 0px; margin: 0px; border-radius: 3px; word-break: normal; border: 0px; display: inline; max-width: initial; overflow: initial; word-wrap: normal; background: transparent;">(CSDN Emoji不能展示用XXXX代替)</code><span style="font-size: 13.6000003814697px; line-height: inherit; background-color: transparent;"> by ugg</span>
截取包含emoji字符的字符串指定长度字符。
截取包含ubb标签的字符串的指定长度字符。
删除字符串中的emoji字符,非严格模式,3字节的emoji字符无法删除,主要用在一些。
删除包含ubb标签字符串中的ubb标签。
使用PHP分别实现了两种方法,分别使用PHP的str_replace方法和PHP查找四字节emoji,进行替换的方法,以及PHP扩展方式,使用相同数据分别进行测试,测试效果如下。
<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; padding: 0px; margin: 0px; border-radius: 3px; word-break: normal; border: 0px; display: inline; max-width: initial; overflow: initial; line-height: inherit; word-wrap: normal; background: transparent;">=========================== 方案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</code>
从以上测试效果上来看,str_replace方式,性能非常的差。使用PHP直接编写替换函数方式,性能提升10倍多,而采用扩展方式后,性能提升明显,在把emoji从字符形式转换为ubb方式时,性能提升1000倍。
以上测试数据通过create_file.php可以动态生成。本测试用例,生成100行数据,每行100个字符,100字符中可以包含3-10个emoji字符,进行测试的,直接运行benchmark.php 查看运行性能。
处理四字节的emoji原理非常简单,通过字符对比找到emoji字符进行替换。难点就是在基本原理上如何提升性能,如何快速查找,替换。PHP扩展方式,为大家提供了一种思路,可以参考这种思路实现java,C#,js等等版本的。
在项目目录中的emoji目录下找到images目录,从web根目录创建emoji文件夹,把images文件夹整个拷贝到emoji文件下,调用encode.class.php里面的carmela_ubb2str方法,
<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; padding: 0px; margin: 0px; border-radius: 3px; word-break: normal; border: 0px; display: inline; max-width: initial; overflow: initial; line-height: inherit; word-wrap: normal; background: transparent;">Util_Encode::carmela_ubb2str($str, "PC");</code>
即可在PC上展示Emoji表情,目前收集到的845个emoji表情,一些新的表情符号并没有纳入其中,当然,目前这种方法并没有写入PHP扩展中,性能相对来说并不高。
<code style="box-sizing: border-box; font-family: Consolas, 'Liberation Mono', Menlo, Courier, monospace; font-size: 13.6000003814697px; padding: 0px; margin: 0px; border-radius: 3px; word-break: normal; border: 0px; display: inline; max-width: initial; overflow: initial; line-height: inherit; word-wrap: normal; background: transparent;"></code>