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

标签 unicode case-insensitive case-folding

要不区分大小写地比较两个字符串,一种正确的方法是区分大小写
先把它们折叠起来。这比上 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 的大写映射是序列 (S​​S)。

uppercase("ẞ") ≠ uppercase(lowercase("ẞ"))

关于unicode - 为什么大写字母不足以进行不区分大小写的比较?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67106784/

相关文章:

python - 基于 Python/MySQL 的管道中的字符编码问题

ios - Swift 中的字符和字符串

php - 古吉拉特语字体显示有正方形和问号,如何删除这些特殊字符?

java - 如何在java或android中读取unicode "\u1f40d"?

python - 如何使 casefold() 在某些阿拉伯语 unicode 上工作

python - Pandas:引用列名,不区分大小写

c# - 折叠案例以加快比较

python - 使用不区分大小写的方式从行名中选择数据帧行(如 `grep -i` )

javascript - 如何使 toLowerCase() 和 toUpperCase() 在浏览器之间保持一致