Normalizator Unicode

Ten sam widoczny ciąg może być przechowywany jako różne sekwencje bajtów w zależności od tego, czy akcent istnieje jako pojedynczy punkt kodowy, czy jako litera plus znak łączący. Ten normalizator konwertuje tekst między czterema formami normalizacji Unicode (NFC, NFD, NFKC, NFKD), aby twoje ciągi porównywały się czysto w bazach danych, indeksach wyszukiwania, skryptach deduplikacji i dopasowaniach wyrażeń regularnych.

Jak normalizować tekst Unicode

  1. 1

    Wklej swoje dane

    Wrzuć ciąg: litery z akcentami, tekst CJK, ligatury, cokolwiek, co wydaje się niespójne.

  2. 2

    Wybierz formę

    Wybierz NFC (złożona, zwykła forma webowa), NFD (rozłożona), NFKC (złożona zgodnościowa) albo NFKD (rozłożona zgodnościowa).

  3. 3

    Porównaj liczby

    Narzędzie podaje liczbę znaków (punktów kodowych) i długość w bajtach przed i po, abyś widział, czy forma skróciła, czy wydłużyła ciąg.

  4. 4

    Skopiuj znormalizowany wynik

    Użyj wyniku w bazie danych, ładunku API, generatorze slugów albo fiksturze testowej.

Cztery formy i kiedy używać każdej

Normalizacja Unicode jest zdefiniowana w standardowym załączniku UAX #15. Cztery formy różnią się wzdłuż dwóch osi: kanoniczna wobec zgodnościowej oraz złożona wobec rozłożonej.

Zestawienie obok siebie

Forma Złożenie Mapowanie Kiedy używać
NFC Złożona Tylko kanoniczne Domyślnie dla treści webowych, baz danych, nazw plików
NFD Rozłożona Tylko kanoniczne Przetwarzanie tekstu usuwające akcenty znak po znaku
NFKC Złożona Obejmuje zgodność Wyszukiwanie, identyfikatory, filtry spamu, składanie do wyświetlania
NFKD Rozłożona Obejmuje zgodność Agresywna normalizacja przed usunięciem znaków diakrytycznych

Formy kanoniczne zachowują znaczenie

Wpisz é i przełączaj formy. NFC podaje 1 znak i 2 bajty (pojedynczy punkt kodowy U+00E9), natomiast NFD podaje 2 znaki i 3 bajty (zwykłe e, po którym następuje łączący akcent ostry, U+0301). Oba wyglądają identycznie na ekranie, ale są różnymi sekwencjami bajtów, i właśnie tę rozbieżność naprawia normalizacja. Formy kanoniczne jedynie przestawiają bajty, więc é w każdej z form zawsze oznacza literę e z akcentem ostrym.

Co tak naprawdę zmienia „zgodność”

Formy K (NFKC, NFKD) przepisują też znaki, które wyglądają pokrewnie, ale niosą inne formatowanie. Jest to operacja stratna: nie odzyskasz oryginału. Na przykład:

  • fi (U+FB01, łacińska mała ligatura fi) staje się fi (dwie litery)
  • ① (U+2460, cyfra jeden w kółku) staje się 1
  • ㌀ (U+3300, kwadratowe CJK „apaato”) staje się アパート
  • Pełnej szerokości A (U+FF21) staje się A

To potężne dla wyszukiwania i deduplikacji, ale niszczące dla typografii, więc sięgaj po formy K tylko wtedy, gdy wierność wizualna nie ma znaczenia.

Praktyczna zasada

  • Przechowuj treść użytkownika w NFC.
  • Porównuj identyfikatory w NFC, aby café zapisane jako pojedynczy punkt kodowy i café zapisane jako e + U+0301 pasowały do siebie; przejdź do NFKC, gdy chcesz też, aby fi i fi albo pełnej szerokości A i A porównywały się jako równe, tak jak robią to reguły identyfikatorów w UAX #31.
  • Twórz slugi bez akcentów, normalizując do NFD i usuwając blok znaków łączących U+0300 do U+036F.

Najczęściej zadawane pytania

Zwykle oznacza to, że twoje dane były już w formie docelowej. Wklej tekst łączący różne źródła (nazwę pliku z Maca, skopiowany fragment PDF, stary wiersz bazy danych), a znacznie częściej zobaczysz zmianę liczby znaków i bajtów.

Dla wyświetlanych adresów URL: NFC. Dla slugów, w których chcesz czyste ASCII, znormalizuj do NFD, usuń znaki łączące wyrażeniem regularnym na U+0300 do U+036F, a potem zamień na małe litery. NFKD to alternatywa, gdy chcesz też składać ligatury i cyfry w kółkach.

Formy kanoniczne (NFC, NFD) nigdy nie zmieniają znaczenia, tylko przestawiają bajty. Formy zgodnościowe (NFKC, NFKD) jednak je zmieniają: ligatury się rozdzielają, litery pełnej szerokości się składają, a indeksy górne się spłaszczają. Używaj ich tylko wtedy, gdy właśnie o to ci chodzi.

Normalizacja działa na naszym serwerze za pomocą klasy Normalizer w PHP, a wynik wraca w tym samym żądaniu; twój tekst nie jest przechowywany. Zapisujemy tylko anonimowe zdarzenie odnotowujące, którą formę zastosowano, nigdy samej treści.

Powiązane narzędzia

Narzędzie jest dostępne w innych językach