简体中文

开发者工具·文本比较

大小写折叠比看起来更难:Unicode 中“忽略大小写”的含义

· 背景

文本差异 统一码 区分大小写

大写和小写线路键聚合,而一种特殊形式保持分离
原始 ToolAcre 矢量图

解释了为什么忽略大小写对于 ASCII 来说是微不足道的,而对于 Unicode 来说是微妙的,以无点 i、锐号 s 和最后的 sigma 为例,以及这对于任何不区分大小写的比较意味着什么。

为什么伊斯坦布尔的两个拼写可能不匹配 - 以涉及土耳其点点大写 I 的现实世界不匹配开头,这让英语开发人员感到惊讶

不区分大小写的比较听起来很普遍,除非标识符、脚本和语言规则不一致。 ToolAcre 的实际规则是具体的:当选择“忽略大小写”时,每个行键在任何空格转换后都会接收 JavaScript `toLowerCase()`。然后严格相等比较结果字符串。

该机制对于标题或普通标签很有用,但其名称不应扩展为区域设置感知的语言平等。 UI 不收集任何区域设置,该函数也不提供任何区域设置。每当案例带有身份或语言含义时,读者都应该检查结果。

ASCII 大小写:一位 — 解释了简单的大写和小写关系,使早期工具的忽略大小写标志变得容易

该工作簿将 ASCII 大小写描述为单位关系,但源代码未实现位算术或纯 ASCII 分支。它在整行上调用平台字符串方法。历史编码解释需要此存储库之外的来源。

对于基本拉丁文本,`Hello` 和 `hello` 在该选项下变得相等,正如测试套件所证明的那样。该测试建立一种行为,而不是每个 Unicode 映射。避免将一个简单的英语示例变成对所有脚本的承诺。

实现调用 JavaScript toLowerCase;它不公开 ASCII 特定的位操作

Unicode 大小写折叠是一个具有自己的数据和状态规则的比较概念。 ToolAcre 不会调用命名折叠库、规范化字符串或记录 Unicode 版本。称这种实现为“全箱折叠”就等于声称不存在机械装置。

合理的描述是使用当前 JavaScript 引擎的小写键比较。原始行保持不变以供显示。如果降低的字符串长度或代码点不同,则该行仍然是删除和添加,而不是强制匹配。

ToolAcre 执行小写映射,而不是记录的 Unicode 大小写折叠操作

大纲名称为土耳其语 I、德语升号 s 和希腊语 sigma。这些是外部来源的 Unicode 文章的合法主题,但此存储库不包含保证它们结果的表或测试。本文故意避免声明精确的映射。

在构建身份规则之前测试目标环境中的实际值并查阅权威的 Unicode 和区域设置文档。用于视觉检查的便利复选框不应成为用户名比较器、安全边界或多语言校对引擎。

命名语言例外需要外部 Unicode 源,此处不保证

将 `Release Notes` 与 `release notes` 进行比较。严格模式报告替换;忽略大小写会报告相同的行并显示原始的左侧文本。添加标点符号或重音变化,并观察到仅小写并不能消除所有差异。

此受控示例演示了该选项,而无需假装解决特定于脚本的行为。查看术语表时,首先运行严格模式并记录仅区分大小写的行。之后切换该选项,将大写噪音与拼写或标点符号更改分开。

工作示例:测试普通拉丁语变体,而不泛化到每个脚本

UI 中不会出现区域设置选择器,并且 `toLowerCase` 不会接收任何语言参数。因此,无论文档的目标语言如何,都会运行相同的转换代码。该路线不知道线路是土耳其语、德语、希腊语还是编程标识符。

这种缺席是实际的警告。对于区域设置感知的搜索、排序或身份识别,请使用围绕这些要求设计的 API,并使用适当的数据固定其行为。文本差异是审阅者对两个字符串的观察,而不是全局命名策略。

此比较选项未提供区域设置参数

本文不承诺非拉丁等效性、规范化、排序规则或针对易混淆字符的安全性。小写无法回答两个名称是否指同一个人、产品或文件系统对象。这些系统可能应用完全不同的案例规则。

忽略空格可以与大小写结合使用,但这样做会扩大消失的范围。一次切换一个选项以确定原因。两者的结果相同,仅说明转换后的线路键匹配;它没有提到字节相等或语义。

要点:为了方便而忽略大小写,而不是为了正确性 — 总结 ToolAcre 文本比较中的选项何时合适以及何时检查结果

当已知大写是表示干扰时,为了方便起见,请使用“忽略大小写”。对代码、路径、产品名称和大小写可能区分值的任何域保持严格模式。检查两个输出,而不是将较宽松的结果作为唯一的记录。

ToolAcre 的实现足够透明,可以精确地说明:可选的空格处理,然后是 JavaScript 小写映射,然后是严格的行键相等。这种温和的主张比来源无法支持的广泛的 Unicode 承诺更有用。