【发布时间】:2013-11-24 21:52:14
【问题描述】:
我正在尝试根据该格式的官方规范实现一个用于读取 Microsoft CFB(复合文件二进制)格式文件的库。规范可用from this site。
简而言之-文件的某些结构存储在红黑树中。我对用于在该树中存储这些结构的比较谓词有疑问。规范说,如果这些结构的名称(字符串存储为 UTF-16,Windows API 中的标准)不同,则有必要遍历每个 UTF-16 代码点并且:
(...) 使用 Unicode 默认大小写转换转换为 大写 算法,简单大小写转换变体(简单大小写折叠),带有以下注释。 比较每个大写的 UTF-16 码位二进制值。
<2> 参考说:
或 Windows XP 和 Windows Server 2003:复合文件实现 符合 Unicode 3.0.1 默认大小写转换算法,简单大小写折叠 (http://www.unicode.org/Public/3.1-Update1/CaseFolding-4.txt),但有以下例外。
但是,当我查看引用的 case fold 文件并阅读其中引用的 UTR #21 "Case Mapping" 时,我意识到 case fold 被定义为更类似于小写而不是大写的操作.
通过CaseFolding-4.txt,我们可以得到大写字母到小写字母的大小写折叠映射。映射始终为 1 对 1,因为此处不需要完全折叠(扩展为多个字符的那些)。然而,小写字母到大写字母的反向映射不再那么简单了。例如,
0392; C; 03B2; # GREEK CAPITAL LETTER BETA
03D0; C; 03B2; # GREEK BETA SYMBOL
因此,我们无法知道应该将03B2 转换为0392 还是03D0。标准是否定义了像折叠成大写这样的东西?也许我应该使用大小写折叠,然后转换为大写?还是我对规范的理解完全错误?
【问题讨论】:
-
大小写折叠只是一种标准化以忽略大小写的方法。是大写还是小写都无所谓。
标签: unicode utf-16 case-folding