Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unicode大小写折叠到大写_Unicode_Utf 16_Case Folding - Fatal编程技术网

Unicode大小写折叠到大写

Unicode大小写折叠到大写,unicode,utf-16,case-folding,Unicode,Utf 16,Case Folding,我正试图实现一个库来读取MicrosoftCfB(复合文件二进制)格式的文件,根据该格式的官方规范。该规范可用 简而言之,文件的某些结构存储在一棵红黑树中。我对用于在树中存储这些结构的比较谓词有一个问题。规范指出,如果这些结构的名称(字符串存储为UTF-16,Windows API中的标准)不同,则有必要迭代每个UTF-16代码点,并: (…)使用Unicode默认大小写转换将其转换为大写 算法,简单大小写转换变体(简单大小写折页),带有以下注释。比较每个大写UTF-16码位二进制值 参考说明:

我正试图实现一个库来读取MicrosoftCfB(复合文件二进制)格式的文件,根据该格式的官方规范。该规范可用

简而言之,文件的某些结构存储在一棵红黑树中。我对用于在树中存储这些结构的比较谓词有一个问题。规范指出,如果这些结构的名称(字符串存储为UTF-16,Windows API中的标准)不同,则有必要迭代每个UTF-16代码点,并:

(…)使用Unicode默认大小写转换将其转换为大写 算法,简单大小写转换变体(简单大小写折页),带有以下注释。比较每个大写UTF-16码位二进制值

参考说明:

或Windows XP和Windows Server 2003:复合文件实现 符合Unicode 3.0.1默认大小写转换算法,简单大小写折叠 ()以下情况除外

然而,当我查阅引用的案例折叠文件并阅读其中引用的案例时,我意识到案例折叠被定义为一种操作,它与下部案例更为相似,而不是上部案例

通过使用
CaseFolding-4.txt
,我们可以获得大写字母到小写字母的大小写折叠映射。映射始终是1对1的,因为这里不需要完整的折叠(扩展到多个字符的折叠)。然而,小写字母到大写字母的反向映射不再简单。比如说,

0392; C; 03B2; # GREEK CAPITAL LETTER BETA
03D0; C; 03B2; # GREEK BETA SYMBOL

因此,我们无法知道是否应将
03B2
转换为
0392
03D0
。该标准是否定义了类似于折叠到大写的内容?也许我应该使用大小写折叠,然后转换成大写?还是我完全错误地理解了规范?

在3.13中,文本中的默认情况算法(第115页)是指。这包括:

03B2;GREEK SMALL LETTER BETA;Ll;0;L;;;;;N;;;0392;;0392
03D0;GREEK BETA SYMBOL;Ll;0;L;<compat> 03B2;;;;N;GREEK SMALL LETTER CURLED BETA;;0392;;0392
03B2;希腊文小写字母BETA;陆上通信线;0;LN0392;;0392
03D0;希腊贝塔符号;陆上通信线;0;L03B2;;;;N希腊文小写字母卷曲BETA;;0392;;0392

这表明希腊文小写字母Beta确实应该映射到希腊文Beta符号,顺便说一下,这两个符号具有一定程度的兼容性。它还包含您正在寻找的双向大小写转换的其余部分。您可能还需要查看SpecialCasing.txt以了解边界情况。

摘要:微软使用的措辞……至少可以说是令人困惑的。看起来应该进行简单的大写映射,尽管我不能确定


背景 部分混淆可能是大小写折叠和大小写映射之间的差异。大小写映射将每个字符映射到指定的大小写。大小写折叠虽然是基于较低的大小写,但其定义是为了产生无大小写字符()

现在有两种不同的大小写映射和大小写折叠,简单和完整。与简单转换不同,完整转换可以更改字符串长度,正如您正确指出的,这里不需要完整转换。规范特别提到了simple,这可能是这个答案中唯一清楚的地方。我确实觉得有必要提到当前的Unicode标准(6.3.0)提到默认的大小写转换是完整的转换,尽管Microsoft references(3.1.1)版本似乎没有这样的区别

规格分析 (…)使用Unicode默认大小写转换算法、简单大小写转换变体(简单大小写折叠)转换为大写,并带有以下注释。比较每个大写的UTF-16码位二进制值

对我来说,这句话似乎表明他们想要大写,只是说了一个错误,用大小写折叠代替大小写映射。但接下来是你引用的参考:

对于Windows XP和Windows Server 2003:复合文件实现符合Unicode 3.0.1默认大小写转换算法,简单大小写折叠(),但以下情况除外

他们实际上提到了箱子折叠数据文件!在这一点上,我不知道该怎么想。我的主要想法是,微软希望折叠手机壳,但错误地认为它是基于上壳而不是下壳。这甚至有点牵强,但这是我能够最接近于调和这一可能的矛盾,我希望有更好的解释

我在下面找到了支撑某种形式上套管的结构:

[…]使用特殊的不区分大小写的大写映射比较目录条目名称,如中所述

请注意,它们实际上在这里使用术语映射

例外列表 看看上面提到的WindowsXP和WindowsServer2003的代码,大多数条目都是减法,这表明微软希望保留不同的代码点。但是,在表中,代码点实际上是按与Unicode大小写折叠数据文件相反的顺序列出的

对此的一种解释是,这只是一种显示怪癖。在最后一行中,他们减去大小写转换
0x03C2->0x03C2
。此转换不存在于数据文件中,因为转换
0x03C2->0x03C3
存在(未列出的案例转换被视为转换为自身)

另一种解释是,他们确实错误地认为,正是反向映射才是正确的。正如您所提到的,这会遇到麻烦,因为反向映射并不总是简单的。否则,这种解释就可以了

第三解释是考虑它们对Unicode实例折叠数据FIL的引用。