4

我有一個數據集,它混合使用unicode字符\ u0421,'С'和\ u0043,'C'。是否有某種unicode比較認爲這兩個字符相同?到目前爲止,我已經嘗試了幾種ICU排序規則,包括俄羅斯規則。西里爾文'С'和拉丁文'C'的Unicode對比

+1

運氣不好我認爲西里爾文C是拉丁文S.你可以編一個CharsetEncoder/Decoder。然而,爲什麼不是一個處理'AaBCcEeHKMOoPpTUuXxYy'(大約是)的'Comparator '。請注意,塞爾維亞人知道'j',白俄羅斯人是'i'。也許你可以使用Arial Unicode MS的字體字形,並派生出一個視覺相似度表。 –

+0

請注意,對於UTF16,構建一個從一個字符集到另一個字符集的65K字符數組是可行的。儘管如此,轉到UTF32,它變得太大而不切實際。 –

回答

4

沒有統一字符編碼的比較,它根據字形的視覺標識將字符視爲相同的字符。然而,Unicode技術標準#39,Unicode Security Mechanisms涉及「可混淆」 - 由於視覺識別或相似性而可能彼此混淆的字符。它包括一個數據文件confusables以及「intentionally confusable」對,即「當使用協調字體設計時,任何特定字體的字形可能會被設計爲相同形狀的字符」,主要由拉丁語和西里爾語或希臘語對組成字母,如C和С.您可能需要編碼您自己使用這些數據,因爲ICU似乎沒有任何與可疑概念相關的任何內容。

1

當你看看http://www.unicode.org/Public/UCD/latest/ucd/UnicodeData.txt時,你會看到一些代碼位置被註釋爲使用中類似的代碼點;但是,我不知道任何涵蓋腳本之間視覺相似性的廣泛列表。您可能想要使用故意拼寫錯誤搜索URL欺騙,這是在他們提出punycode時討論的。除此之外,您最好的選擇可能是使用正則表達式在數據之外搜索字符,然後編譯一系列特殊文本修復程序,如text = text.replace /с/, 'c'