php開發中處理emoji表情和顏文字的相容問題
阿新 • • 發佈:2018-11-15
背景:
隨著手機的普及,現在移動開發很火爆,已經遠遠超過了pc端。 在移動裝置經常會發生使用者傳送的內容中包含emoji表情,在顯示時就是亂碼。
一般是因為Mysql表設計時,都是用UTF8字符集的。把帶有emoji的暱稱欄位往裡面insert一下就沒了,整個欄位變成了空字串。 這是因為Mysql的utf8字符集是3位元組的,而emoji是4位元組,這樣整個暱稱就無法儲存了。
現在介紹在PHP開發中涉及到emoji表情的三種處理方法: 1)使用utf8mb4字符集
如果你的mysql版本>=5.5.3,你大可直接將utf8直接升級為utf8mb4字符集
這種4位元組的utf8編碼可完美相容舊的3位元組utf8字符集,並且可以直接儲存emoji表情,是最好的解決方案
至於位元組增大帶來的效能損耗,我看過一些評測,幾乎是可以忽略不計的
2)使用base64編碼
如果你因為某些原因無法使用utf8mb4的話,你還可以使用base64來曲線救國
使用例如base64_encode之類的函式編碼過後的emoji可以直接儲存在utf8位元組集的資料表中,取出時base64_decode一下即可
3)去掉emoji表情
在iOS以外的平臺上,例如PC或者android。如果你需要顯示emoji,就得準備一大堆emoji圖片並使用第三方前端類庫才行。 emoji表情是個麻煩的東西,即使你能儲存,也不一定能完美顯示,所以我們可以將它過濾掉。
在google裡找到能用的過濾的程式碼,如下:
[php]
view plain
copy
總結:
我個人在App開發中也遇到了這個問題,權衡對比了一下三個方法。 方法一是改字符集編碼, 這個成本有一點高,而且怕改了後影響其他的程式,所以忽略了這個方法。
方法三,可以過濾Emoji表情,但是不能對顏文字進行過濾,也不能滿足所有需求。因為Mysql的utf8字符集是3位元組的,而emoji是4位元組,資料庫還是不能儲存。
綜合考慮所以最後選擇base64編碼。這個方法比較簡單,對於Emoji表情和顏文字也都相容。
只是寫入的時候要base64_encode,讀取的時候要base64_decode一下。 base64的缺點就是每次讀資料還得base64_decode一下,而且儲存的資料不直觀。
但是相對我們的情況,這個方法是最靠譜的。風險小也能解決問題。 當然也可以直接在客戶端過濾,禁止輸入表情和顏文字,這樣更加直接有效。但是這得重新發包,不能及時解決問題。
隨著手機的普及,現在移動開發很火爆,已經遠遠超過了pc端。 在移動裝置經常會發生使用者傳送的內容中包含emoji表情,在顯示時就是亂碼。
一般是因為Mysql表設計時,都是用UTF8字符集的。把帶有emoji的暱稱欄位往裡面insert一下就沒了,整個欄位變成了空字串。 這是因為Mysql的utf8字符集是3位元組的,而emoji是4位元組,這樣整個暱稱就無法儲存了。
現在介紹在PHP開發中涉及到emoji表情的三種處理方法: 1)使用utf8mb4字符集
如果你的mysql版本>=5.5.3,你大可直接將utf8直接升級為utf8mb4字符集
這種4位元組的utf8編碼可完美相容舊的3位元組utf8字符集,並且可以直接儲存emoji表情,是最好的解決方案
至於位元組增大帶來的效能損耗,我看過一些評測,幾乎是可以忽略不計的
2)使用base64編碼
如果你因為某些原因無法使用utf8mb4的話,你還可以使用base64來曲線救國
使用例如base64_encode之類的函式編碼過後的emoji可以直接儲存在utf8位元組集的資料表中,取出時base64_decode一下即可
3)去掉emoji表情
在iOS以外的平臺上,例如PC或者android。如果你需要顯示emoji,就得準備一大堆emoji圖片並使用第三方前端類庫才行。 emoji表情是個麻煩的東西,即使你能儲存,也不一定能完美顯示,所以我們可以將它過濾掉。
在google裡找到能用的過濾的程式碼,如下:
[php]
- // 過濾掉emoji表情
- function filterEmoji($str)
- {
- $str = preg_replace_callback(
- '/./u',
- function
- return strlen($match[0]) >= 4 ? '' : $match[0];
- },
- $str);
- return $str;
- }
總結:
我個人在App開發中也遇到了這個問題,權衡對比了一下三個方法。 方法一是改字符集編碼, 這個成本有一點高,而且怕改了後影響其他的程式,所以忽略了這個方法。
方法三,可以過濾Emoji表情,但是不能對顏文字進行過濾,也不能滿足所有需求。因為Mysql的utf8字符集是3位元組的,而emoji是4位元組,資料庫還是不能儲存。
綜合考慮所以最後選擇base64編碼。這個方法比較簡單,對於Emoji表情和顏文字也都相容。
只是寫入的時候要base64_encode,讀取的時候要base64_decode一下。 base64的缺點就是每次讀資料還得base64_decode一下,而且儲存的資料不直觀。
但是相對我們的情況,這個方法是最靠譜的。風險小也能解決問題。 當然也可以直接在客戶端過濾,禁止輸入表情和顏文字,這樣更加直接有效。但是這得重新發包,不能及時解決問題。
效果圖如下:
ios:
andriod: