设计在 Mac 上把 résumé.pdf 传上去,下载和预览都正常,按文件名查附件的接口却回 404。把名字贴进 Python 打印,两个串的 len 差了 1。第一次遇到会往复杂处想,其实漏掉的多是个小前提。
python3 -c "import unicodedata as u;a=u.normalize('NFD','résumé');b=u.normalize('NFC','résumé');print(len(a),len(b),a==b)"
macOS 文件系统存的是 NFD,é 被拆成 e 加组合重音符。服务端入库的是 NFC 的单个码位,字节不同,等值比较和唯一索引都认为这是两个名字。这一点先确认清楚,后面就不用反复试。
「Unicode 规范化」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
具体做法是,收到文件名先做一次 NFC 规范化再入库;查询侧同样规范化 两边用同一套规则;唯一索引建在规范化之后的列上;老数据跑一遍批量 normalize 再对比重复项。
改完照着核一遍,同一个文件名在 Mac 和 Windows 上传 库里只有一条记录 查询都能命中。
