Wszystko, czego nigdy nie chciałeś wiedzieć o normalizacji Unicode
Normalizacja kanoniczna
Unicode obejmuje wiele sposobów kodowania niektórych znaków, w szczególności znaków akcentowanych. Normalizacja kanoniczna zmienia punkty kodowe w kanoniczną formę kodowania. Wynikowe punkty kodowe powinny wyglądać identycznie jak oryginalne, z wyjątkiem błędów w czcionkach lub silniku renderowania.
Kiedy użyć
Ponieważ wyniki wyglądają identycznie, zawsze można bezpiecznie zastosować normalizację kanoniczną do łańcucha przed jego zapisaniem lub wyświetleniem, o ile można tolerować, że wynik nie jest identyczny z bitem za bity, co dane wejściowe.
Normalizacja kanoniczna występuje w 2 formach: NFD i NFC. Obydwa są równoważne w tym sensie, że między tymi dwoma formami można przejść bez strat. Porównanie dwóch ciągów w NFC zawsze da ten sam wynik, co porównanie ich w NFD.
NFD
NFD ma postacie w pełni rozwinięte. Jest to szybsza forma normalizacji do obliczenia, ale skutkuje to większą liczbą punktów kodowych (tj. Zajmuje więcej miejsca).
Jeśli chcesz tylko porównać dwa ciągi, które nie zostały jeszcze znormalizowane, jest to preferowana forma normalizacji, chyba że wiesz, że potrzebujesz normalizacji zgodności.
NFC
NFC ponownie łączy punkty kodowe, jeśli to możliwe, po uruchomieniu algorytmu NFD. Trwa to trochę dłużej, ale skutkuje krótszymi strunami.
Normalizacja zgodności
Unicode zawiera również wiele znaków, które tak naprawdę nie należą, ale były używane w starszych zestawach znaków. Unicode dodał je, aby umożliwić przetwarzanie tekstu w tych zestawach znaków jako Unicode, a następnie konwertowanie z powrotem bez utraty.
Normalizacja zgodności konwertuje je na odpowiednią sekwencję „rzeczywistych” znaków, a także przeprowadza normalizację kanoniczną. Wyniki normalizacji zgodności mogą nie wyglądać identycznie jak oryginały.
Znaki zawierające informacje o formatowaniu są zastępowane znakami, które ich nie zawierają. Na przykład znak ⁹
zostanie przekonwertowany na 9
. Inne nie obejmują różnic w formatowaniu. Na przykład cyfra rzymska Ⅸ
jest konwertowana na zwykłe litery IX
.
Oczywiście po wykonaniu tej transformacji nie jest już możliwa bezstratna konwersja z powrotem do oryginalnego zestawu znaków.
Kiedy użyć
Konsorcjum Unicode sugeruje myślenie o normalizacji zgodności jak o ToUpperCase
transformacji. Jest to coś, co może się przydać w pewnych okolicznościach, ale nie powinno się jej stosować tylko chcąc nie chcąc.
Doskonałym przypadkiem użycia byłaby wyszukiwarka, ponieważ prawdopodobnie chciałbyś, 9
aby pasowało zapytanie ⁹
.
Jedną z rzeczy, których prawdopodobnie nie powinieneś robić, jest wyświetlanie użytkownikowi wyniku zastosowania normalizacji zgodności.
NFKC / NFKD
Formularz normalizacji zgodności występuje w dwóch formach NFKD i NFKC. Mają taki sam związek jak między NFD i C.
Każdy ciąg w NFKC jest z natury także w NFC i to samo dla NFKD i NFD. Tak więc NFKD(x)=NFD(NFKC(x))
i NFKC(x)=NFC(NFKD(x))
itd.
Wniosek
W razie wątpliwości przejdź do normalizacji kanonicznej. Wybierz NFC lub NFD w oparciu o odpowiedni kompromis między przestrzenią / prędkością lub w oparciu o to, czego wymaga coś, z czym współpracujesz.