我正在開發一個需要生成「不區分大小寫」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是正確的,那爲什麼?
如果可以的話,我會多次讚揚這個清晰,權威的答案。 –
事實證明,我對定義的術語「阻塞」有深刻的誤解。我還沒有理解,如果之間沒有任何先發球員首次與之組合,那麼組合角色就可以與之前的首發組合。優秀的答案。 –