今天遇到评论中加入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;
}