首先说明一下 Emoji 是文字,而不是图标,所以 Emoji 字符是 Unicode 字符集中一部分,特定形象的 Emoji 表情符号对应到特定的 Unicode 字节。
Emoji 存储需要四个字节
使用 Emoji 最大的问题是数据库存储不了,出错或者出现乱码,这是因为MySQL 的 UTF-8 字符集是存储不了 emoji 表情,因为 MySQL 中的 UTF-8 只用 3 个字节存储,所以存储不了表情,其实 MySQL 的 UTF-8 其实是 utf8mb3 的别名。
如果我们要存储 Emoji 表情,那么需要支持完整的 UTF-8 字符集,就是需要使用 4 个字节来存储字符,这个字符集名字叫 utf8mb4。
WordPress 如何存储和显示 Emoji
针对 Emoji,WordPress 在存储和显示这两方面做了处理,
WordPress 为了都能存储 Emoji,使用函数 wp_encode_emoji
函数将 Emoji 转换成 HTML 实体来存储,这样就不用担心数据库不支持 utf8mb4。
WordPress 为了都能显示 Emoji,使用函数 wp_staticize_emoji
函数将 Emoji 转换成图片显示,这样就不用担一些比较老旧的浏览器不显示 Emoji。
优化 WordPress Emoji 的处理
但是随着技术的发展,现在绝大部分服务器的 MySQL 数据库(5.5版本之后)都支持 utf8mb4 编码格式,所以无需将 Emoji 转换成 HTML 实体进行存储了,直接存储速度更快,节省了实体转换的时间消耗。
另外 WordPress 用于显示的 Emoji 的图片都是放在 http://s.w.org/images/core/emoji/
资源下,令人尴尬的是,http://s.w.org/ 这个域名在国内访问不了的,这个功能反而成为了拖慢博客显示的原因了。
现在几乎所有的浏览器都能够显示 Emoji 了,所以我们完全可以禁用 WordPress 对 Emoji 的处理功能,比较简单,我已经整理好了,在当前主题的 functions.php
文件中添加如下代码即可:
remove_action('admin_print_scripts', 'print_emoji_detection_script');
remove_action('admin_print_styles', 'print_emoji_styles');
remove_action('wp_head', 'print_emoji_detection_script', 7);
remove_action('wp_print_styles', 'print_emoji_styles');
remove_action('embed_head', 'print_emoji_detection_script');
remove_filter('the_content_feed', 'wp_staticize_emoji');
remove_filter('comment_text_rss', 'wp_staticize_emoji');
remove_filter('wp_mail', 'wp_staticize_emoji_for_email');
add_filter( 'emoji_svg_url', '__return_false' );