跳到主要内容

去除重音/变音符号完全指南:é 变 e,ñ 变 n,ü 变 u

讲清变音符号怎么去掉,从 Unicode NFD 分解原理到 URL slug、搜索匹配、数据规范化的真实用法,并说明哪些字母拆不开需要单独处理。

发布于 作者 李雷
#去除重音 #变音符号 #Unicode #文本规范化 #URL slug

去除重音/变音符号完全指南:从原理到实战

带重音的字母看着只是头顶多了一笔,真到了系统里却经常出事。café 存进数据库,前端搜 cafe 搜不到;résumé 做成文件名,老旧 ZIP 工具把它拆成一串百分号编码;München 拼成 URL,复制粘贴一圈回来已经面目全非。把这些变音符号去掉,让 é 落回 e、ñ 落回 n、ü 落回 u,是很多数据流程里安静却关键的一步。这篇把去重音这件事讲透:它到底在拆什么,哪些字母拆得开、哪些拆不开,以及该用在什么地方、不该用在什么地方。

变音符号到底是什么

变音符号是叠加在基础字母上的小记号:法语的锐音符 é、西班牙语的波浪号 ñ、德语的分音符 ü、葡萄牙语的软音符 ç。它们改变发音或区分词义,但底层骨架仍是那个拉丁字母。去重音的目标很明确:保留基础字母,丢掉头顶那一笔,得到一个纯 ASCII 的拼写。

注意一个边界:去重音只针对带可叠加记号的拉丁字母。中文、日文、韩文、阿拉伯文这些不是拉丁字母加重音,而是各自独立的字符,没有可去掉的记号,所以正确的做法是原样放行,绝不去碰。一行里混着「北京 café」,结果应该是「北京 cafe」,前半截分毫不动。

核心原理:Unicode NFD 分解

真正干活的是 Unicode 的 NFD 规范化,也就是规范分解。它的妙处在于:很多带重音的字母在 Unicode 里既可以写成一个码点,也可以写成「基础字母 + 组合记号」两个码点。NFD 就是把前者拆成后者。

拿 é 举例。它常以单码点 U+00E9 出现,NFD 一跑,它被拆成两个码点:一个普通的 e(U+0065),加上一个独立的组合锐音符(U+0301)。组合记号集中落在 U+0300 到 U+036F 这一段。于是去重音的算法就清晰了:先 NFD 分解,再把这一段里的所有组合记号删掉,剩下的就是裸露的基础字母。

这个三步走对一整类字母都成立:

  • é → NFD → e + U+0301 → 删记号 → e
  • ñ → NFD → n + U+0303(组合波浪号)→ 删记号 → n
  • ü → NFD → u + U+0308(组合分音符)→ 删记号 → u

一个真实的输入输出例:把 café 粘进去,NFD 把 é 拆成 e 加组合锐音符,删掉记号后输出就是 cafe。同样的路径让 naïvenaiveMüllerMuller。原理一致,规则只有一条,不需要为每种语言写一份对照表。想动手验证 NFD 把字符拆成了什么,可以用 Unicode 规范化工具 看每个码点的分解结果。

拆不开的字母:需要单独一张映射表

NFD 不是万能的。有些字母不是「基础字母加记号」的组合,而是自成一体的独立字形,分解它们什么也拆不出来。最典型的是德语 ß、北欧的 ø、波兰的 ł、越南语的 đ,还有连写字 æ、œ、þ。

对这些字母,唯一可靠的办法是维护一张小映射表,做音译展开:ß 变 ss,ø 变 o,ł 变 l,æ 变 ae,œ 变 oe,þ 变 th,大写形式一并处理。所以 straße 不会停在半路的 straße,而是变成 strasse。如果不想动这些特殊字母,把对应选项关掉即可,工具会让它们原样保留。记住这个坑:以为单靠 NFD 就能得到完整 ASCII,结果 ß、ø 这类字母悄悄漏了过去。

三个最常见的用途

生成干净的 URL slug。 一篇叫 Crème Brûlée 的文章,标题直接做 slug 会得到一串百分号编码。先去重音得到 creme-brulee,再交给 slug 步骤,链接在浏览器、CDN、分析工具里都被一致处理,复制粘贴也保持可读。这一步通常紧接着 slug 生成器 一起用。

让搜索忽略重音。 用户输 resume,数据库里存的是 résumé;输 Munchen,要找的是 München。把存储字段和查询都过一遍去重音,两边终于能对上。搜索就此变得重音不敏感,不靠任何分语言的脆弱规则,这正是人们对一个宽容搜索框的期待。

数据规范化与清洗。 一张满是 ñ、é、ü、ø 的欧洲客户名表,丢给严格的 ASCII 导入器或老数据库字段就报错。去掉重音再贴回去,导入不再抛编码异常。文件名同理,résumé.pdf 变 resume.pdf,上传、下载、链接认同一个安全拼写。

我自己的一点经验

我第一次踩坑是做一个用户能搜的内部文档站。测试时同事搜 cafe 怎么都找不到那篇明明存在的「Café 运营手册」,我盯着数据库看了半天才反应过来:存进去的标题带着那个 é,而搜索框里敲的是普通 e,两个字符串在字节层面根本不相等。后来我把索引字段和查询都先去一遍重音再比对,问题当场消失。从那以后我养成习惯:凡是面向机器比对的那一层,一律先规范化;凡是给人看的展示层,原文一字不动地留着。

一条要守住的底线:去重音是有损的

去重音会丢信息。法语的 résumé(简历)和 resume(恢复)去掉重音后塌成同一个拼写,某些语言里靠变音符区分词义的两个词也会失去差别。所以原则很简单:给人阅读的展示文字保留重音,只在面向机器的那一层做去重音,slug、搜索键、文件名、标识符这些必须是 ASCII 的场景才用,而原始的带重音文本始终保存在别处作为准据。把这条记牢,去重音就只会帮你,不会悄悄改坏你的内容。


Made by Toolora · Updated 2026-06-13