背景:
隨著手機的普及,現在移動開發很火爆,已經遠遠超過了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
// 過濾掉emoji表情
function
filteremoji(
$str
) ,
$str
);
return
$str
; }
當然你也可以直接在客戶端過濾,禁止輸入表情和顏文字。這樣更加直接有效。
總結:方法一是改字符集編碼, 這個成本有一點高,而且怕改了後影響其他的程式,所以忽略了這個方法。
方法三,可以過濾emoji表情,但是不能對顏文字進行過濾,也不能滿足所有需求。因為mysql的utf8字符集是3位元組的,而emoji是4位元組,資料庫還是不能儲存。
綜合考慮所以最後選擇base64編碼。這個方法比較簡單,對於emoji表情和顏文字也都相容。
只是寫入的時候要base64_encode,讀取的時候要base64_decode一下。
base64的缺點就是每次讀資料還得base64_decode一下,而且儲存的資料不直觀。
但是相對我們的情況,這個方法是最靠譜的。風險小也能解決問題。
當然也可以直接在客戶端過濾,禁止輸入表情和顏文字,這樣更加直接有效。但是這得重新發包,不能及時解決問題。
效果圖如下:
PHP處理字元中的emoji表情
目錄 utf 8 編碼的 emoji 表情或者某些特殊字元占用 4 個位元組。utf 8 編碼的常用中文字元占用 3 個位元組。三個 php 內建函式 mixed mb strlen string str string encoding mb internal encoding 返回具有 encod...
php開發中處理emoji表情和顏文字的相容問題
背景 隨著手機的普及,現在移動開發很火爆,已經遠遠超過了pc端。在移動裝置經常會發生使用者傳送的內容中包含emoji表情,在顯示時就是亂碼。一般是因為mysql表設計時,都是用utf8字符集的。把帶有emoji的暱稱字段往裡面insert一下就沒了,整個字段變成了空字串。這是因為mysql的utf8...
php開發中處理emoji表情和顏文字的相容問題
背景 隨著手機的普及,現在移動開發很火爆,已經遠遠超過了pc端。在移動裝置經常會發生使用者傳送的內容中包含emoji表情,在顯示時就是亂碼。一般是因為mysql表設計時,都是用utf8字符集的。把帶有emoji的暱稱字段往裡面insert一下就沒了,整個字段變成了空字串。這是因為mysql的utf8...