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/phpize./configure --with-php-config=/php-config-pathmakemake install
修改設定檔
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代替) by ugg
carmela_substr:
截取包含emoji字元的字串指定長度字元。
carmela_sububb:
截取包含ubb標籤的字串的指定長度字元。
carmela_delstr:
刪除字串中的emoji字元,非strict 模式,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 查看運行效能。
PC如何支援EMoji表情展示?
在項目目錄中的emoji目錄下找到images目錄,從web根目錄建立emoji檔案夾,把images檔案夾整個拷貝到emoji檔案下,調用encode.class.php裡面的carmela_ubb2str方法,
Util_Encode::carmela_ubb2str($str, "PC");
即可在PC上展示Emoji表情,目前收集到的845個emoji表情,一些新的Emoji並沒有納入其中,當然,目前這種方法並沒有寫入PHP擴充中,效能相對來說並不高。
Contact ugg.xchj@gmail.com for all questions