我正在开发一个需要生成“不区分大小写”Unicode文本片段的规范化形式的C项目。我选择将规范化表格定义为通过首先转换为标准化形式的NFD,然后应用Unicode大小写折叠算法,最后将结果转换为Unicode规范化形式NFC。这个Unicode NFC转换是否正确?
我依靠ICU的C API来实现Unicode的表示和实用功能,使用ICU的unorm_normalize()
和u_strFoldCase()
函数实现我的方案非常简单。但我的一个测试失败了,我不明白为什么。 ICU似乎正在生成与我预期不同的NFC形式。
输入序列由这些BMP代码点:
U+0020, U+1EA5, U+0328, U+1EC4, U+031C
通过调试器,我确定ICU和我同意中间结果的情况下折叠后:特别是
U+0020 U+0061 U+0328 U+0302 U+0301 U+0065 U+031C U+0302 U+0303
注根据相关字符的相对CCC数字,较早转换成NFD的字符将字符U + 031C移动到U + 1EC4分解的中间。这是我试图测试的一部分。
现在好部分:根据ICU,折叠字符序列的NFC正常化
U+0020 U+0105 U+0302 U+0301 U+1ec5 U+031C
,而我认为这应该是
U+0020 U+0105 U+0302 U+0301 U+0065 U+031C U+0302 U+0303
,因为3个连续的组合字符已经按照规范的顺序,并且U + 0065和U + 031C没有规范组成。
于是,两个问题:
- 这是正确的NFC形式?
- 如果ICU是正确的,那为什么?
如果可以的话,我会多次赞扬这个清晰,权威的答案。 –
事实证明,我对定义的术语“阻塞”有深刻的误解。我还没有理解,如果之间没有任何先发球员首次与之组合,那么组合角色就可以与之前的首发组合。优秀的答案。 –