php開發中處理emoji表情和顏文字的相容問題

2021-08-18 01:39:28 字數 1657 閱讀 1148

背景:

隨著手機的普及,現在移動開發很火爆,已經遠遠超過了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...