Unicode-normaliserare

Samma synliga sträng kan lagras som olika bytesekvenser beroende på om en accent finns som en enda kodpunkt eller som en bokstav plus ett kombinerande tecken. Den här normaliseraren omvandlar text mellan de fyra Unicode-normaliseringsformerna (NFC, NFD, NFKC, NFKD) så att dina strängar jämförs rent i databaser, sökindex, avdupliceringsskript och regex-matchningar.

Så normaliserar du Unicode-text

  1. 1

    Klistra in din indata

    Lägg in strängen: accentbokstäver, CJK-text, ligaturer, allt som känns inkonsekvent.

  2. 2

    Välj en form

    Välj NFC (komponerad, den vanliga webbformen), NFD (dekomponerad), NFKC (kompatibilitetskomponerad) eller NFKD (kompatibilitetsdekomponerad).

  3. 3

    Jämför antalen

    Verktyget rapporterar antalet tecken (kodpunkter) och bytelängden före och efter, så att du ser om formen förkortade eller förlängde strängen.

  4. 4

    Kopiera den normaliserade utdatan

    Använd resultatet i din databas, API-nyttolast, slug-generator eller testfixtur.

De fyra formerna och när du använder var och en

Unicode-normalisering definieras av standardbilagan UAX #15. De fyra formerna skiljer sig längs två axlar: kanonisk kontra kompatibilitet, och komponerad kontra dekomponerad.

Referens sida vid sida

Form Komposition Mappning När du använder den
NFC Komponerad Endast kanonisk Standard för webbinnehåll, databaser, filnamn
NFD Dekomponerad Endast kanonisk Textbearbetning som tar bort accenter per tecken
NFKC Komponerad Inkluderar kompat. Sökning, identifierare, spamfilter, visningsvikning
NFKD Dekomponerad Inkluderar kompat. Aggressiv normalisering före borttagning av diakriter

Kanoniska former bevarar betydelsen

Skriv é och växla mellan formerna. NFC rapporterar 1 tecken och 2 byte (den enda kodpunkten U+00E9), medan NFD rapporterar 2 tecken och 3 byte (ett vanligt e följt av en kombinerande akut accent, U+0301). De två ser identiska ut på skärmen men är olika bytesekvenser, och just den avvikelsen är vad normaliseringen åtgärdar. Kanoniska former omarrangerar bara byten, så é i någon av formerna betyder alltid bokstaven e med akut accent.

Vad “kompatibilitet” faktiskt ändrar

K-formerna (NFKC, NFKD) skriver även om tecken som ser besläktade ut men bär på annan formatering. Detta är förstörande: du kan inte få tillbaka originalet. Till exempel:

  • fi (U+FB01, latinsk liten ligatur fi) blir fi (två bokstäver)
  • ① (U+2460, inringad siffra ett) blir 1
  • ㌀ (U+3300, det fyrkantiga CJK-tecknet “apaato”) blir アパート
  • Fullbredds-A (U+FF21) blir A

Det är kraftfullt för sökning och avduplicering men förstörande för typografi, så ta till K-formerna bara när visuell trohet inte spelar roll.

En praktisk regel

  • Lagra användarinnehåll i NFC.
  • Jämför identifierare i NFC så att café skrivet som en enda kodpunkt och café skrivet som e + U+0301 matchar; gå upp till NFKC när du också vill att fi och fi, eller fullbredds-A och A, ska jämföras som lika, precis som identifierarreglerna i UAX #31 gör.
  • Skapa accentfria slugs genom att normalisera till NFD och ta bort blocket med kombinerande tecken U+0300 till U+036F.

Vanliga frågor

Oftast betyder det att din indata redan var i målformen. Klistra in text som blandar källor (ett Mac-filnamn, en kopierad PDF-snutt, en rad från en äldre databas) så är det mycket mer sannolikt att du ser antalet tecken och byte ändras.

För visnings-URL:er, NFC. För slugs där du vill ha ren ASCII, normalisera till NFD, ta bort de kombinerande tecknen med ett regex på U+0300 till U+036F, och gör sedan om till gemener. NFKD är ett alternativ när du även vill vika ligaturer och inringade siffror.

Kanoniska former (NFC, NFD) ändrar aldrig betydelsen, de omarrangerar bara byte. Kompatibilitetsformer (NFKC, NFKD) ändrar den däremot: ligaturer delas, fullbreddsbokstäver viks och upphöjda tecken plattas till. Använd dem bara när det är vad du vill.

Normaliseringen körs på vår server via PHP:s Normalizer-klass och resultatet kommer tillbaka i samma begäran; din text lagras inte. Vi loggar bara en anonym händelse som noterar vilken form som tillämpades, aldrig själva innehållet.

Relaterade verktyg

Verktyget finns på andra språk