处理开发中遇到的 Emoji 存取问题

在 lamp 环境的微信开发中,昵称的存储本来不是问题,但后来发现有的用户使用emoji表情做昵称,存储到数据库的时候就变为空了。

原因是我们常用的 utf8_general_ci / utf8_unicode_ciuft8mb3 编码,最多 3 个字节,而 emoji 需要 4 个字节。这里提供几个解决方法:

○ 改变数据库的编码

从 MySQL 5.5.3 开始,MySQL支持一种 utf8mb4 的字符集,这个字符集能够支持 4 字节的 UTF8 编码的字符。utf8mb4 字符集能够完美地向下兼容 utf8 字符串。在数据存储方面,当一个普通中文字符存入数据库时仍然占用 3 个字节,在存入一个 Unified Emoji 表情的时候,它会自动占用 4 个字节。所以在输入输出时都不会存在乱码的问题了。

○ 使用base64编码

如果条件限制不能使用新版本的 MySQL,也可以使用 base64 将字符串 encode 后存储,取出的时候 decode 再用即可。

○ 过滤解决

把 emoji 直接过滤掉,简单方便有效。虽然损失了几个 emoji 字符,总好过整个字符串丢失。

1
2
3
4
5
6
public function removeEmoji($str='') {
$str = preg_replace_callback('/./u', function (array $match) {
return strlen($match[0]) >= 4 ? '' : $match[0];
}, $str);
return $str;
}