大小写折叠操作的结果中不能出现多少个 Unicode 代码点?

How many Unicode code points cannot appear in the result of a case-folding operation?

这个问题很容易理解,但回答起来可能并不简单。

Unicode 中有 0x110000 个不同的代码点。

"Case folding" 是一种可以对字符串执行的有损操作,以便获得适合与其他字符串进行不区分大小写比较的该字符串的表示形式。在英语中,这类似于在对它们进行排序之前将所有字符串更改为小写(因此所有以大写字母开头的字符串都不会在前面结束!),除了大小写折叠操作不尊重任何一种语言的大小写规则(因此它只适用于内部操作,不显示给用户)。

有些代码点(我认为)不会出现在任何大小写折叠的字符串中。我想尽可能准确地知道其中有多少。

有多个版本的大小写折叠算法(并且该算法可以针对不同的 languages/contexts 进行自定义),但是当使用 Unicode 标准中指定的算法时:在 CaseFolding.txt(至少具有 C 状态,并且 SF)不能出现在大小写折叠的字符串中。

对于真正的不区分大小写的比较,具有 NFKC 规范化形式或 Default_Ignorable_Code_Point 属性 的字符也将被替换并且不会出现。这是在 DerivedNormalizationProps.txt 中具有 NFKC_Casefold 映射的字符集——总共 10,146 个代码点。