正規化和排序
更新:2007 年 11 月
一些 Unicode 字元具有由和/或 (and/or) 組合之複合 Unicode 字元集所組成的多重對等二進位表示。結果,兩個字串可能外表看來完全相同,其實是由不同字元組成。因為單一字元的多重表示讓排序作業複雜化。解決這個問題的辦法是將每個字串正規化,然後使用序數比較為字串排序。
Unicode 標準會定義稱為正規化的程序,在給予字元的任何對等二進位表示時,傳回一項該字元的二進位表示。Unicode 標準會定義四個不同的演算法,稱為正規化表單,可以讓您用來將字串正規化。每個正規化表單都遵守不同的規則,因此會產生不同之輸入字串的二進位表示。但是,如果兩個字串正規化為相同的正規化表單,字串就可以接著用序數 (不區分大小寫) 比較進行比較。
兩個字串的序數比較是兩個表示已正規化字串的 String 物件中,各個 Char 結構之對應字組之數值或字碼指標的二進位比較。.NET Framework 提供幾個方法,可以執行序數比較。
您的應用程式可以使用下列程序來正規化和排序字串:
從輸入來源 (例如,檔案或使用者輸入) 取得兩個要排序的字串。
使用 String.Normalize() 方法,將兩個字串都正規化為正規化表單 C,或是使用 String.Normalize(NormalizationForm) 方法,將兩個字串都正規化為您所選擇的正規化表單。
使用序數字串比較,例如 Compare(String, Int32, String, Int32, Int32, StringComparison) 方法加上 Ordinal 或 OrdinalIgnoreCase 值,來比較兩個字串。比較作業會判斷第一個字串是否在詞彙性上位於第二個字串之前,或是兩個字串的詞彙性是否相等。
根據步驟 3 的結果,在已排序輸出中發出字串,如果字串不相等,則依達成遞增或遞減的順序,發出字串。
除非依其他特性而非詞彙性順序排列字串比較適當,當字串相等時,每一個字串都可以先發出。例如,如果應用程式是以檔案名稱排序,同時也將各個檔案的屬性寫入輸出中,可能就要依檔案建立日期的順序寫入相等的檔案名稱。
重複此程序,直到所有輸入都已排序為止。
如需 .NET Framework 支援之正規化表單的詳細資訊,請參閱 NormalizationForm 列舉型別的描述。如需將字串正規化的詳細資訊,請參閱 Normalize 方法。
如需正規化、字元切割及等價的詳細資訊,請參閱位於 Unicode 主站台的 Unicode 標準附錄 #15,<Unicode 正規化格式>。