PHP中處理emoji表情

weixin_34146805發表於2016-11-25

今天遇到評論中加入emoji表情導致整個字元存到資料庫中為空的情況,出現這種情況是因為mysql資料庫表用的utf-8字符集也就是3位元組,但emoji表情是4位元組,導致無法insert.

下面寫下怎麼存到資料庫和怎麼清除掉emoji.

PHP中將emoji表情儲存到mysql資料庫

  • 修改資料庫字符集

  • 將對應的表字符集改為utf8mb4,排序規則改為utf8mb4_unicode_ci

  • 將對應的欄位的字符集改為utf8mb4,排序規則改為utf8mb4_unicode_ci

  • 修改連結方式

    在資料庫的配置檔案中將charset改為utf8mb4,將collation改為utf8mb4_unicode_ci。

'mysql' => [
    'host'      => env('DB_HOST_SLAVE_ONE'), 
    'username'  => env('DB_USERNAME_SLAVE_ONE'), 
    'password'  => env('DB_PASSWORD_SLAVE_ONE'),
    'driver'    => 'mysql',   
   'database'  => env('DB_DATABASE'),    
   'charset'   => 'utf8mb4',    
  'collation' => 'utf8mb4_unicode_ci',
  'prefix'    => '',    
  'strict'    => false,],

記得重啟mysql,嗯,一定要重啟。

PHP將emoji從字串中清除

步驟:

  • 將字元中原有?替換掉

  • 將字串從utf-8轉為iso-8859-1

  • 再還原回utf-8(mb_convert_encoding函式會將無效的字元轉為?

  • 將這些無效的?''替換掉

  • 將最初的?還原回來

程式碼如下:

function removeEmojis( $string ) 
{ 
        $string = str_replace( "?", "{%}", $string ); 
        $string = mb_convert_encoding( $string, "ISO-8859-1", "UTF-8" ); 
        $string = mb_convert_encoding( $string, "UTF-8", "ISO-8859-1" ); 
        $string = str_replace( array( "?", "? ", " ?" ), array(""), $string ); 
        $string = str_replace( "{%}", "?", $string ); 
        return trim( $string );
}

驗證字串中是否含有emoji表情

還有些情況是我們直接驗證,如果含有emoji表情則報格式錯誤,程式碼如下。

public function findEmoji($source){
    $mat = [];
    preg_match_all('/./u', $source,$mat);
    foreach ($mat[0] as $v){
        if(strlen($v) > 3){return true;}
    }
    return false;
}

相關文章