文本和日常工具·文本工具包
slug 生成器如何折叠重音:NFD 分解解释
· 工作原理
url-slugs 文本转换 JavaScript
解释 Unicode 规范分解如何将基本字母与其重音分开,以便“Café Crème”变成cafe-creme而不是caf-cr-me,以及单独分解的不足之处。
caf-cr-me — 破坏名称的常见蛞蝓 bug 及其发生原因
弱 slug 例程删除狭窄 ASCII 范围之外的每个字符时,它可以将 `Café Crème` 转换为 `caf-cr-me` 。可见的重音符号消失了,但底层的基本字母也随之消失,留下的 URL 不再类似于文章标题。这种损害在名称、地点和重复的编辑类别中尤其明显。
ToolAcre 在 `slugify` 中采取不同的路径。它首先对输入进行标准化,然后删除特定范围的组合标记,同时保留结果字母。只有之后它才会将文本和形状分隔符小写。该顺序是 `Café Crème` 变为 `cafe-creme` 而不是缺少元音的片段的原因。
一个字符,两种表示 — é 如何成为单个代码点或 e 后跟组合锐音符
看起来相同的文本可以具有不同的内部序列。 `é` 可以作为一个预组合字符到达,也可以作为一个普通的 `e` 后跟一个组合尖锐标记到达。内容编辑器通常无法看到哪个表示来自 CMS、文档或剪贴板,但逐字符过滤器可以以不同的方式处理这两个输入。
当替换规则识别一种形式而不识别另一种形式时,隐藏的差异很重要。 ToolAcre 避免为每个预组合拼写编写单独的替换。规范化为 slug 管道提供了一种更一致的中间形式,因此可以通过后续步骤删除受支持的重音符号,同时基本字母仍可用于 URL。
规范化形式 D — 规范分解如何将每个重音字母重写为基本字母加组合标记
实现在任何小写或分隔符工作之前调用 `.normalize("NFD")` 。对于具有由 JavaScript 运行时处理的规范分解的字符,这会生成一个基本字符,后跟一个或多个组合标记。该函数不维护自己的法语或西班牙语拼写目录,也不从语义上检查单词。
大纲说 NFD 重写了每个带重音的字母,但来源支持更窄的说法。分解取决于字符,以下删除表达式涵盖从 `U+0300` 到 `U+036F` 的代码点。因此,本文应该描述代码所演示的行为,而不是承诺对每个脚本或标记进行通用重音删除。
NFD 分解支持的字符;该实现并不保证每个重音字母都会分开
规范化后,`slugify` 应用 `/[̀-ͯ]/g` 并用空字符串替换每个匹配标记。在 `é` 的分解形式中,`e` 与该范围不匹配,而锐角标记则匹配。仅删除标记会留下可读的基本字母,而早期的仅 ASCII 方法会丢弃这些字母。
这是重音折叠,而不是一般的文本清理过程。正则表达式故意放置在分隔符规则之前,允许基本字母稍后作为字母参与。如果在无支撑的运行已经折叠之后进行标记去除,则分解的标记可能会影响分隔符的放置并产生不太忠实的段塞。
slug 管道的其余部分 - 小写、将非字母数字运行折叠为单个连字符、修剪前导和尾随分隔符、删除表情符号
其余管道将规范化文本小写,并将每个不是 Unicode 字母或数字的运行替换为配置的分隔符(默认为连字符)。第二个表达式修剪两端重复的分隔符。因此,表情符号和标点符号作为内容消失,而相邻的不受支持的字符则成为一个边界而不是几个连字符。
轮廓描述了非字母数字折叠,但实际模式使用 Unicode 属性转义,而不是纯 ASCII 字母。非拉丁字母的字母在小写后可以保留在段中。配置确认没有音译步骤:符号被删除,但保留的字母不会自动重写为近似的拉丁语拼写。
该 slug 管道的其余部分保留任何脚本中的字母和数字,同时用所选分隔符替换其他运行
遵循 `Café Crème & Co. — Été 2024!` 实施。 NFD 将支持的重音字符分为基本字母和标记。标记删除表达式留下 `Cafe Creme & Co. — Ete 2024!`,小写会在标点符号处理之前生成 `cafe creme & co. — ete 2024!`。
非字母和非数字串随后变成连字符,在修剪前导和尾随分隔符后产生有意义的序列 `cafe-creme-co-ete-2024` 。 & 符号、句号、破折号和感叹号不接受口语名称或自定义替换。它们仅充当此转换中字母和数字运行之间的边界。
分解不能做什么 - 像 ø、ł、ß 和 æ 这样的字母没有重音可以去除,需要一个音译表
分解不是音译。诸如 `ø`、`ł`、`ß` 和 `æ` 之类的字符在此管道之后仍然是 Unicode 字母,因此基于属性的过滤器会保留它们,而不是查询表中的 `o`、`l`、`ss` 或 `ae`。声称用户需要音译表可能在其他地方是有用的设计建议,但此工具中不存在这样的表。
这种区别也解释了为什么结果可能是有效的项目 slug,而不是纯 ASCII。出版系统需要 ASCII 的编辑者应在使用输出之前检查单独的系统约束。 ToolAcre 承诺对已实现的分解和标记范围进行重音折叠;它不承诺为每个标题提供语言感知拼写、可逆转换或拉丁语输出。
没有可移除标记的字符仍然是字母;该工具没有音译表
可靠的要点是程序性的:首先标准化,删除支持的组合标记,小写,折叠不支持的运行并修剪分隔符。每个阶段都有一个可见的职责,并且它们的顺序在标点符号被丢弃之前保留基本字母。这足以防止常见的 `caf-cr-me` 失败,而无需发明源代码不包含的语言规则。
将工作后的标题粘贴到文本大小写转换器中,然后选择 slug 选项以在同一文本框中检查最终结果。如果标题包含所演示的重音大小写之外的字母,请根据目标平台检查输出。转换器提供可预测的浏览器端转换,而编辑器仍然负责路由约定。