变音符号
变音符号(diacritics)是附加在字母上方、下方或内部的小记号,用来改变字母的读音或区分含义,常见于法语、西班牙语、德语、葡萄牙语、越南语等。例如 é、ñ、ü、ç、à 中的重音、波浪号、变元音点。它和「音标(IPA)」不是一回事:音标是一套独立的注音系统,而变音符号是直接长在字母上、属于单词拼写的组成部分。
在 Unicode 里,一个带变音符号的字符往往有两种表示方式:
- 预组合形式:整体是一个码点,如
é= U+00E9; - 组合形式:基础字母加一个组合附加符号,如
e+ U+0301。
二者对应 NFC 与 NFD 两种规范化。所谓「去除变音符号」,通常就是先做 NFD 分解,再删掉 U+0300–U+036F 这段组合符号(Unicode 类别 Mn),留下纯 ASCII 基础字母,把 café 还原成 cafe。它常用于生成 URL slug、搜索匹配、排序与模糊比对。
要注意:并非所有字符都能靠分解处理。德语 ß、北欧 ø、波兰 ł 没有「基础字母 + 组合符号」的结构,简单去符号会漏掉,需要单独建映射表。此外去符号可能改变原意(西语 año「年」去掉波浪号成 ano 就是另一个词),所以它只适合做技术层面的归一化,别用在需要保留原义的正文展示上。
常见问题
去除变音符号会不会破坏中文或普通英文?
不会。纯 ASCII 英文字母和中文本身不带组合符号,NFD 分解对它们没有任何影响,只有带重音的拉丁字母才会被还原成基础字母。
变音符号和音标(IPA)是一回事吗?
不是。音标是一套独立的注音符号系统,专门用来标注发音;变音符号则是直接附加在普通字母上的记号,是单词正常拼写的一部分。
为什么去符号后有些字符(如 ß、ø)没被处理掉?
因为它们在 Unicode 里是独立字母,不存在「基础字母 + 组合符号」的分解形式,靠 NFD 加删组合符号的通用做法碰不到,需要额外建立映射表来转换。