资讯文章 资讯 · NEWS
站点名带 emoji 和生僻字:目录站字符集的四个坑,从 utf8mb4 说到豆腐块
2026-10-23 约 1,068 字 预计阅读 3 分钟 yiyunkj
站
做中文目录站,早晚会收到这种提交:站名里带 emoji,或者用了一个你从来没见过的生僻字。存的时候、显示的时候、搜索的时候、导出的时候,四个环节的脾气都不一样。这篇文章把这串问题一次过完。

图片来源:网络,版权归原作者所有,侵权请联系删除
坑一:数据库的「utf8」其实存不下 emoji
MySQL 老版本里那个叫 utf8 的字符集是 3 字节实现的,emoji 和部分生僻字需要 4 字节,插进去轻则报错,重则被静默截断——截断比报错可怕,站名尾巴莫名少个字,你可能几周都发现不了。
解法是全链路换 utf8mb4:库、表、列、连接字符集四个层面都要对齐,只改表不改连接,等于改了一半。迁移前先跑一遍存量数据检查,把已经截断的行找出来,这种历史伤是查不出原因的重灾区。
坑二:域名里的中文,本质是另一串字符
中文域名和带 emoji 的域名,在域名系统里存的是 punycode——形如 xn--xxxx 的 ASCII 串。你收录的站如果用中文域名,证书、日志、robots 文件里看到的都是这串编码,只有浏览器地址栏显示回中文。
对目录站的直接影响是匹配:同一个站,有人提交中文形式,有人提交 punycode 形式,字符串层面是两个完全不同的值。条目去重和域名归一化要做 punycode 层面的统一,否则重复收录跑不掉。
坑三:字体回退与「豆腐块」
生僻字显示成方框(俗称豆腐块),不是数据坏了,是用户设备的字体里没有这个字形。服务器端没法强制用户装字库,能做的是别把这个字放进关键位置:站名首字、搜索热词榜、标题里都尽量避免。它出现在正文里无所谓,出现在页面的 SEO 三要素里,搜索结果展示出来就是一排方框,点击率替你买单。
站点名含 emoji 的,标题标签里也别指望它:搜索结果的标题链接对 emoji 的支持极不稳定,多数情况下不显示。指望一颗星星提升点击率,最后看到的是标题中段一个空洞。
坑四:搜索时的规范化
用户搜「⭐优选」不会带 emoji,搜全角星号「*」又是另一个字符。搜索层要做两件事:索引侧把 emoji 和装饰符号剥掉、全半角统一;查询侧做同样处理再匹配。另外 Unicode 有多种规范化形式,同一个字可能有不同的编码组合,入库前统一做一次 NFC 规范化,能把「明明一样却搜不到」的诡异问题消掉大半。
| 环节 | 动作 |
|---|---|
| 入库 | utf8mb4 + NFC 规范化 + 记录原始形式 |
| 展示 | 关键位置避开不可显示字符,正文保留 |
| 搜索 | 索引与查询两侧同步剥装饰符、全半角统一 |
| 去重 | 域名统一到 punycode 后比较 |
字符问题的共同特点是「不报错,只是不对」。测试时专门找带 emoji 和生僻字的样本走一遍全流程,比事后排查省十倍力气。