为什么大写字母不足以进行不区分大小写的比较?

93I*_*LMO 6 unicode case-insensitive case-folding

要不区分大小写地比较两个字符串,一种正确的方法是先将它们大小写折叠。这比上壳或下壳好在哪里?

我找到了一些示例,其中小写字母在网上无法正常工作。例如 ”?” 和 ”?” (两种形式的“?”)在转换为小写时不会变得相同。但是我没有找到为什么大小写折叠比映射到大写更好。是否存在应该不区分大小写匹配的两个字符串不大写到相同字符串的情况?

另一种情况是当我想存储不区分大小写的索引时。推荐的方式似乎是大小写折叠然后归一化。与存储映射到大写和规范化的字符串相比,它有什么优势?规范说映射到大写不能保证跨 Unicode 版本稳定,而大小写折叠是。但是在早期版本的 Unicode 中,是否存在映射到大写会给出不同字符串的情况?

Cha*_*uff 9

按照Unicode的稳定性政策,案例映射仅供情况下对稳定的,即对字符的XŸ,其中X为全大写映射ÿ,并ÿ是全小写映射X。只有当这两个字符与这些属性一起存在时,它们之间的大小写关系才会一成不变。

但是,Unicode 包含许多“不完整”的大小写对,其中仅对小写形式进行了编码,而大写形式完全缺失。对于传统上仅使用小写字母的转录系统中使用的字母,通常就是这种情况。如果发现大写形式并随后将其添加到 Unicode,则这些字母将收到新的大写映射。

最近出现的字符是“?” (来自 Unicode 1.1),“?” (来自 Unicode 4.1)和“?” (来自 Unicode 7.0),它们在两年前的 Unicode 12.0 中都获得了全新的大写形式(?, ?, ?)。

因为大小写映射不必是唯一的,这使得大写无法替代正确的大小写折叠。例如,U+0434 (?) 和 U+1C81 (?) 都大写到 U+0414 (?),但由于 U+0414 的全小写映射,只有前者被锁定为大小写对。如果有人在某个旧手稿中找到 U+1C81 的专用大写字母版本,它将被赋予一个新的大写映射,导致 U+0434 和 U+1C81 在该操作下突然不再比较相等。

编辑:我刚刚记得一个当前的例子,大写不足以进行不区分大小写的匹配: U+1E9E (?) 已经是一个大写字母,因此它本身是大写的。它的小写对应物是 U+00DF (ß),但 U+00DF 的大写映射是序列 <U+0053, U+0053> (S​​S)。

uppercase("?") ? uppercase(lowercase("?"))
Run Code Online (Sandbox Code Playgroud)