Condividi tramite


Normalizzazione e ordinamento

Aggiornamento: novembre 2007

Alcuni caratteri Unicode hanno più rappresentazioni binarie equivalenti formate da set di caratteri Unicode combinati e/o compositi. Di conseguenza, due stringhe possono apparire identiche ma essere in realtà costituite da caratteri differenti. L'esistenza di più rappresentazioni per un unico carattere ha l'effetto di complicare le operazioni di ordinamento. La soluzione a questo problema consiste nel normalizzare ogni stringa e quindi utilizzare un confronto ordinale per ordinare le stringhe.

Nello standard Unicode viene definito un processo denominato normalizzazione che restituisce un'unica rappresentazione binaria di un carattere a partire da una qualsiasi delle rappresentazioni binarie equivalenti di tale carattere. In questo standard vengono definiti quattro algoritmi differenti, detti formati di normalizzazione, che è possibile utilizzare per normalizzare una stringa. Ogni formato di normalizzazione obbedisce a regole differenti e quindi genera una diversa rappresentazione binaria di una stringa di input. Se tuttavia due stringhe sono normalizzate nello stesso formato, possono essere successivamente confrontate mediante un confronto ordinale (senza distinzione tra maiuscole e minuscole).

Per confronto ordinale di due stringhe si intende un confronto binario del valore numerico, o punto di codice, di ciascuna coppia corrispondente di strutture Char nei due oggetti String che rappresentano le stringhe normalizzate. In .NET Framework sono disponibili diversi metodi che possono eseguire un confronto ordinale.

Per la normalizzazione e l'ordinamento delle stringhe l'applicazione può utilizzare il processo indicato di seguito:

  1. Ottenere due stringhe da ordinare da un'origine di input, ad esempio un file o l'input dell'utente.

  2. Utilizzare il metodo String.Normalize() per normalizzare entrambe le stringhe nel formato C oppure il metodo String.Normalize(NormalizationForm) per normalizzarle nel formato desiderato.

  3. Utilizzare un confronto ordinale, ad esempio il metodo Compare(String, Int32, String, Int32, Int32, StringComparison) con un valore Ordinal o OrdinalIgnoreCase, per eseguire il confrontare tra le due stringhe. In base all'operazione di confronto, verrà stabilito se dal punto di vista lessicale la prima stringa precede la seconda oppure se le due stringhe sono uguali.

  4. Generare le stringhe nell'output ordinato in base ai risultati del passaggio 3. Se le stringhe non sono uguali, generare le stringhe in base a un ordinamento crescente o decrescente.

    Se le stringhe sono uguali, l'ordine di generazione è indifferente, a meno che non sia opportuno disporre le stringhe in base a una caratteristica diversa dall'ordinamento lessicale. Se ad esempio vengono ordinati i nomi di file e nell'output sono riportate anche le proprietà di ciascun file, può essere opportuno fare in modo che l'applicazione elenchi i nomi di file uguali in base alle rispettive date di creazione.

  5. Ripetere questo processo finché tutto l'input non risulta ordinato.

Per ulteriori informazioni sui formati di normalizzazione supportati in .NET Framework, vedere la descrizione dell'enumerazione NormalizationForm. Per ulteriori informazioni sulla normalizzazione di una stringa, vedere il metodo Normalize.

Per ulteriori informazioni sulla normalizzazione, la scomposizione dei caratteri e l'equivalenza, vedere il documento Unicode Standard Annex #15 "Unicode Normalization Forms" sul sito Web Unicode (informazioni in lingua inglese).

Vedere anche

Concetti

Normalizzazione

Ordinamento dipendente dalla lingua

Confronto e ordinamento di dati per specifiche impostazioni cultura

Altre risorse

Codifica e localizzazione