1.過濾emoji表情的原因
在我們的項目開發中,emoji表情是個麻煩的東西,即使我們可以能存儲,也不一定能完美顯示,因為它的更新速度很快:在iOS以外的平台上,例如PC或者android。如果你需要顯示emoji,就得准備一大堆emoji圖片並使用第三方前端類庫才行。即便如此,還是可能因為emoji圖片不夠全而出現無法顯示的情況
在大多數業務場景下,emoji也不是非要不可的。我們可以適當地考慮干掉它,節約各種成本。
2.php過濾emoji原理
Emoji (絵文字,詞義來自日語えもじ,e-moji,moji在日語中的含義是字符)是一套起源於日本的12x12像素表情符號,由栗田穣崇(Shigetaka Kurit)創作,最早在日本網絡及手機用戶中流行。自蘋果公司發布的iOS 5輸入法中加入了emoji后,這種表情符號開始席卷全球,目前emoji已被大多數現代計算機系統所兼容的Unicode編碼采納,普遍應用於各種手機短信和社交網絡中。近期,更是有不少網友用emoji圖案玩猜字游戲,享受這種表情文化帶來的樂趣。
關於emoji的發音:很多人第一眼見到emoji便會下意識將其誤讀作“一磨嘰”,其實不然,emoji音譯過來大概讀作“誒磨嘰”,當中“e”的發音頗似字母abc的a的發音。
最初日本的三大電信運營商各自有不同的字符定義,分別是DoCoMo、KDDI和Softbank。隨着iOS內置了Softbank的版本,emoji在全球范圍內風靡(iOS5版本以前)。而Google又自己定義了一套emoji字符。iOS5以后,apple采用了unicode定義的emoji字符(iOS5版本以后)。
unicode定義的emoji是四個字符,softbank為3個字符,emoji的四個字符從存儲到展示對應沒有做過考慮的系統來說,簡直就是災難。
3.針對unicode定義的emoji表情過濾
①.unicode定義的emoji是四個字符,根據這個原理進行過濾
// 過濾掉emoji表情 function filter_Emoji($str) { $str = preg_replace_callback( //執行一個正則表達式搜索並且使用一個回調進行替換 '/./u', function (array $match) { return strlen($match[0]) >= 4 ? '' : $match[0]; }, $str); return $str; }
②. unicode emoji是4個字節,softbank定義的emoji占用3個字節存儲,通過emoji for php ,我們可以把unicode的emoji方式轉換為softbank方式,從而實現不修改數據庫,就能存儲emoji,相對於數據庫層面的解決問題的方式,動作要小的多,並且也不會有性能,運維等方面的問題。但是有個不可避免的問題是,Softbank方式已經不再維護,所以新增加的emoji表情,Softbank中都沒有,會造成部分emoji表情丟失的情況,對於這種情況不推薦使用。
后續還有一些方法沒有親自實踐過,但是給大家提供出來。
1、使用utf8mb4字符集
如果你的mysql版本>=5.5.3
,你可以嘗試直接將utf8
直接升級為utf8mb4
字符集
這種4字節的utf8編碼可完美兼容舊的3字節utf8字符集,並且可以直接存儲emoji表情,是較好的解決方案之一。
至於字節增大帶來的性能損耗,根據自己的項目,自己估算吧....
2、使用base64編碼
如果你因為某些原因無法使用utf8mb4字符集的話,你還可以使用base64
來曲線救國
使用例如base64_encode
之類的函數編碼過后的emoji可以直接存儲在utf8字節集的數據表中,取出時decode一下即可
1.utf8mb4的最低mysql版本支持版本為5.5.3+,若不是,請升級到較新版本。
mysql版本查看命令請看:查看mysql版本的四種方法;mysql安裝步驟請看:Linux中升級Mysql到Mysql最新版本的方法
2.修改database、table和column字符集。參考以下語句:
ALTER DATABASE database_name CHARACTER SET = utf8mb4 COLLATE = utf8mb4_unicode_ci;
ALTER TABLE table_name CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
ALTER TABLE table_name CHANGE column_name VARCHAR(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
3.修改mysql配置文件my.cnf(windows為my.ini)
my.cnf一般在etc/mysql/my.cnf位置。找到后請在以下三部分里添加如下內容:
[client]
default-character-set = utf8mb4
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-client-handshake = FALSE
character-set-server = utf8mb4
collation-server = utf8mb4_unicode_ci
init_connect='SET NAMES utf8mb4'
4.重啟 MySQL Server、檢查字符集
1.)重啟命令參考:/etc/init.d/mysql restart
2.)輸入命令:mysql,進入mysql命令行(如果提示沒權限,可以嘗試輸入mysql -uroot -p你的密碼)
3.)在mysql命令行中輸入:SHOW VARIABLES WHERE Variable_name LIKE 'character_set_%' OR Variable_name LIKE 'collation%';
檢查是否如下:
+--------------------------+--------------------+
| Variable_name | Value |
+--------------------------+--------------------+
| character_set_client | utf8mb4 |
| character_set_connection | utf8mb4 |
| character_set_database | utf8mb4 |
| character_set_filesystem | binary |
| character_set_results | utf8mb4 |
| character_set_server | utf8mb4 |
| character_set_system | utf8 |
| collation_connection | utf8mb4_unicode_ci |
| collation_database | utf8mb4_unicode_ci |
| collation_server | utf8mb4_unicode_ci |
+--------------------------+--------------------+
rows in set (0.00 sec)
特別說明下:collation_connection/collation_database/collation_server如果是utf8mb4_general_ci,沒有關系。但必須保證character_set_client/character_set_connection/character_set_database/character_set_results/character_set_server為utf8mb4。關於這些字符集配置是干什么用的,有什么區別,請參考:深入Mysql字符集設置
5.修改連接數據字符集設置uft8mb4
'db' => [
'class' => 'yii\db\Connection',
'dsn' => 'mysql:host=192.168.1.130;dbname=',
'username' => '',
'password' => '',
'charset' => 'utf8mb4',
],