要不区分大小写地比较两个字符串,一种正确的方法是区分大小写
先把它们折叠起来。这比上 shell 或下 shell 好在哪里?
我找到了一些示例,其中小写字母在网上无法正常工作。为了
例如“σ”和“ς”(“Σ”的两种形式)在以下情况下不会变得相同
转换为小写。但我没能找到为什么折叠是
比映射到大写更好。是否有两个字符串的情况
应该不区分大小写匹配,不要大写相同
字符串?
另一种情况是当我想存储不区分大小写的索引时。这
推荐的方法似乎是大小写折叠然后规范化。什么是
它优于存储映射到大写的字符串和
标准化?规范说不能保证映射到大写
在大小写折叠时跨 Unicode 版本稳定。但是有没有
映射到大写的任何情况下都会在
早期版本的 Unicode?
最佳答案
根据 Unicode stability policy , case 映射仅对 case 对稳定,即字符 X 和 Y 对,其中 X 是 Y 的完整大写映射,Y 是 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 的大写映射是序列 (SS)。uppercase("ẞ") ≠ uppercase(lowercase("ẞ"))
关于unicode - 为什么大写字母不足以进行不区分大小写的比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67106784/