PHP如何过滤Unicode 9之后版本的Emoji?适配MySQL 8 utf8mb4_0900
解决方案:仅过滤Unicode 9之后新增的Emoji
要解决这个问题,核心是精准识别并移除Unicode 9.0(对应Emoji 5.0)之后新增的Emoji字符,同时保留Unicode 9及更早版本的Emoji。以下是具体实现方法:
一、明确需要过滤的Emoji码点范围
Unicode 9之后的Emoji主要对应Emoji 6.0及后续版本,其码点集中在以下区间:
- U+1F980 至 U+1F9FF(Unicode 10+新增)
- U+1FA70 至 U+1FAFF(Unicode 11+新增)
- U+1FAB0 至 U+1FABF(Unicode 12+新增)
- U+1FAC0 至 U+1FACF(Unicode 13+新增)
- U+1FAD0 至 U+1FADF(Unicode 14+新增)
- U+1FAE0 至 U+1FAEF(Unicode 15+新增)
- U+1FAF0 至 U+1FAFF(Unicode 15+新增)
这些区间外的Emoji(比如😀 U+1F600、🤦 U+1F926等)都属于Unicode 9及更早版本,可正常保留。
二、PHP实现过滤逻辑
方法1:正则表达式替换(简洁高效)
利用PHP的Unicode正则支持,直接匹配并替换目标区间的字符:
function filterPostUnicode9Emojis(string $input): string { // 匹配Unicode 9之后的Emoji码点 $newEmojiPattern = '/[\x{1F980}-\x{1F9FF}\x{1FA70}-\x{1FAFF}\x{1FAB0}-\x{1FABF}\x{1FAC0}-\x{1FACF}\x{1FAD0}-\x{1FADF}\x{1FAE0}-\x{1FAEF}\x{1FAF0}-\x{1FAFF}]/u'; return preg_replace($newEmojiPattern, '', $input); }
- 必须添加
u修饰符,确保正则解析Unicode字符而非字节。 - 该方法适合大多数场景,执行效率较高。
方法2:逐个字符检查(精准可控)
如果需要更精细的控制(比如记录被过滤的字符),可以逐个遍历字符并检查码点:
function filterPostUnicode9Emojis(string $input): string { $filtered = ''; $charCount = mb_strlen($input, 'UTF-8'); for ($i = 0; $i < $charCount; $i++) { $char = mb_substr($input, $i, 1, 'UTF-8'); $codePoint = mb_ord($char, 'UTF-8'); // 判断是否属于Unicode 9之后的Emoji区间 $isNewEmoji = match(true) { ($codePoint >= 0x1F980 && $codePoint <= 0x1F9FF) => true, ($codePoint >= 0x1FA70 && $codePoint <= 0x1FAFF) => true, ($codePoint >= 0x1FAB0 && $codePoint <= 0x1FABF) => true, ($codePoint >= 0x1FAC0 && $codePoint <= 0x1FACF) => true, ($codePoint >= 0x1FAD0 && $codePoint <= 0x1FADF) => true, ($codePoint >= 0x1FAE0 && $codePoint <= 0x1FAEF) => true, ($codePoint >= 0x1FAF0 && $codePoint <= 0x1FAFF) => true, default => false }; if (!$isNewEmoji) { $filtered .= $char; } } return $filtered; }
三、测试验证
调用函数测试效果:
$testInput = "Hello 😀 你好 🦆 测试 🦧"; echo filterPostUnicode9Emojis($testInput); // 输出:Hello 😀 你好 测试
可以看到,Unicode 9的😀被保留,Unicode 10的🦆和🦧被过滤。
四、注意事项
- 肤色修饰符(U+1F3FB至U+1F3FF)属于Unicode 8,无需过滤,它们会和旧Emoji正常组合使用。
- ZWJ组合Emoji(比如👨👩👧)只要组成字符都是Unicode 9及更早版本,就可以正常保留,无需额外处理。
内容的提问来源于stack exchange,提问作者caitlin
相关产品推荐
相关产品推荐

