Sdílet prostřednictvím


Normalizace a řazení

Některé znaky Unicode mají více odpovídající binární reprezentace skládající se ze sady kombinování a/nebo skládání znaků Unicode. V důsledku toho mohou dva řetězce vypadat identicky, ale ve skutečnosti se skládají z různých znaků. Existence více reprezentací pro jeden znak komplikuje operace řazení. Řešením tohoto problému je každý řetězec normalizovat potom řetězce seřadit pomocí porovnávání pořadového čísla.

Standard Unicode definuje proces nazvaný normalizace, který vrací jednu binární reprezentaci znaku pro kteroukoliv zadanou ekvivalentní binární reprezentaci tohoto znaku. Standard Unicode definuje čtyři různé algoritmy nazývané normalizační formy, které lze použít k normalizaci řetězce. Každá normalizační forma dodržuje různá pravidla, a proto jsou výsledkem různé binární reprezentace vstupního řetězce. Nicméně pokud jsou dva řetězce normalizovány na stejnou normalizační formu, řetězce mohou být následně porovnány pomocí pořadového čísla (bez rozlišení velkých a malých písmen).

Porovnávání dvou řetězců pomocí pořadového čísla je binární porovnání číselné hodnoty nebo bodu kódu každé odpovídající dvojice struktur Char ve dvou objektech String, které představují normalizované řetězce. Rozhraní .NET Framework poskytuje několik metod, které mohou provádět porovnávání podle pořadového čísla.

Vaše aplikace může použít následující proces pro normalizování a řazení řetězců:

  1. Získat dva řetězce, které mají být seřazeny ze vstupního zdroje, jako je například soubor nebo uživatelský vstup.

  2. Použít metodu String.Normalize() pro normalizování obou řetězců na normalizovanou formu C nebo použít metodu String.Normalize(NormalizationForm) pro normalizování obou řetězců na takovou normalizovanou formu, jakou vyberete.

  3. Použít porovnání řetězců podle pořadového čísla, například metodu Compare(String, Int32, String, Int32, Int32, StringComparison) s hodnotou Ordinal nebo OrdinalIgnoreCase pro porovnání dvou řetězců. Operace porovnání určuje, zda první řetězec lexikálně předchází druhý nebo jsou oba řetězce lexikálně stejné.

  4. Poslat řetězce v seřazeném výstupu na základě výsledků třetího kroku. Pokud se řetězce neshodují, pošlete řetězec v pořadí, které dosahuje vzestupného nebo sestupného pořadí.

    Pokud jsou řetězce shodné, tak jeden řetězec může být poslán první, pokud není vhodné řetězce uspořádat na základě některé charakteristiky, která je jiná než lexikální pořadí. Například pokud aplikace seřazuje názvy souborů, ale také zapisuje vlastnosti každého souboru do výstupu, tak může zapsat stejné názvy souborů v pořadí podle jejich data vytvoření.

  5. Opakovat tento postup, dokud veškerý vstup není seřazen.

Další informace o podpoře forem normalizace v rozhraní .NET Framework naleznete v popisu výčtu NormalizationForm. Další informace týkající se normalizování řetězce naleznete u metody Normalize.

Další informace týkající se normalizace, dekompozice znaku a rovnocennosti naleznete v příloze číslo 15 standardu Unicode - „Unicode Normalization Forms“ na domovské stránce standardu Unicode.

Viz také

Koncepty

Řazení pomocí jazykových verzí

Porovnání a řazení dat pro konkrétní jazykovou verzi

Další zdroje

Kódování a lokalizace