Tutto ciò che non avresti mai voluto sapere sulla normalizzazione Unicode
Normalizzazione canonica
Unicode include diversi modi per codificare alcuni caratteri, in particolare i caratteri accentati. La normalizzazione canonica modifica i punti di codice in una forma di codifica canonica. I punti di codice risultanti dovrebbero apparire identici a quelli originali, escludendo eventuali bug nei caratteri o nel motore di rendering.
Quando usare
Poiché i risultati appaiono identici, è sempre sicuro applicare la normalizzazione canonica a una stringa prima di memorizzarla o visualizzarla, purché sia possibile tollerare che il risultato non sia bit per bit identico all'input.
La normalizzazione canonica si presenta in 2 forme: NFD e NFC. I due sono equivalenti nel senso che si può convertire senza perdita tra queste due forme. Il confronto di due stringhe in NFC darà sempre lo stesso risultato del confronto in NFD.
NFD
NFD ha i personaggi completamente espansi. Questo è il modulo di normalizzazione più veloce da calcolare, ma i risultati in più punti di codice (cioè usano più spazio).
Se vuoi solo confrontare due stringhe che non sono già normalizzate, questa è la forma di normalizzazione preferita a meno che tu non sappia che hai bisogno di normalizzazione di compatibilità.
NFC
NFC ricombina i punti di codice quando possibile dopo aver eseguito l'algoritmo NFD. Questo richiede un po 'più di tempo, ma si traduce in stringhe più brevi.
Normalizzazione di compatibilità
Unicode include anche molti personaggi che in realtà non appartengono, ma sono stati utilizzati in set di caratteri legacy. Unicode li ha aggiunti per consentire l'elaborazione del testo in quei set di caratteri come Unicode e quindi la riconversione senza perdita.
La normalizzazione della compatibilità li converte nella corrispondente sequenza di caratteri "reali" e esegue anche la normalizzazione canonica. I risultati della normalizzazione della compatibilità potrebbero non apparire identici agli originali.
I caratteri che includono informazioni sulla formattazione vengono sostituiti con quelli che non lo fanno. Ad esempio, il personaggio ⁹
viene convertito in 9
. Altri non comportano differenze di formattazione. Ad esempio, il carattere numerico romano Ⅸ
viene convertito in lettere regolari IX
.
Ovviamente, una volta eseguita questa trasformazione, non è più possibile riconvertire senza perdita di dati al set di caratteri originale.
Quando usare
Il consorzio Unicode suggerisce di pensare alla normalizzazione della compatibilità come a una ToUpperCase
trasformazione. È qualcosa che può essere utile in alcune circostanze, ma non dovresti semplicemente applicarlo volenti o nolenti.
Un caso d'uso eccellente sarebbe un motore di ricerca poiché probabilmente vorrai che una ricerca 9
corrispondesse ⁹
.
Una cosa che probabilmente non dovresti fare è visualizzare il risultato dell'applicazione della normalizzazione della compatibilità all'utente.
NFKC / NFKD
Il modulo di normalizzazione della compatibilità è disponibile in due forme NFKD e NFKC. Hanno la stessa relazione tra NFD e C.
Qualsiasi stringa in NFKC è intrinsecamente anche in NFC, e lo stesso vale per NFKD e NFD. Quindi NFKD(x)=NFD(NFKC(x))
, e NFKC(x)=NFC(NFKD(x))
, ecc.
Conclusione
In caso di dubbi, seguire la normalizzazione canonica. Scegli NFC o NFD in base allo scambio spazio / velocità applicabile o in base a ciò che è richiesto da qualcosa con cui interagisci.