Parenteser

Betraktninger fra Mat-teamets grønne enger

Bokstavpønt til bekymring

Jeg har nylig skrevet litt om søk, og hvordan man kan få til å treffe på omtrent det brukeren skrev. En ting jeg ikke har dekket er hvordan man kan hjelpe folk å finne “el niño” når de skriver “el nino”, eller “kafé” når de skriver “kafe”.

Tegn som ñ og é kan være litt kronglete å jobbe med fordi ingen av dem er ett tegn - det finnes flere Unicode-former som gir samme visuelle resultat. ñ kan for eksempel være en av disse to:

  • Latin Small Letter N with Tilde (ñ), Unicode code point U+00F1
  • En kombinasjon av U+006E (n) og U+0303 (“Combining Tilde”)

Heldigvis finnes det en løsning på miseren: Unicode-normalisering.

Både Java og JavaScript har innebygget verktøy for å normalisere Unicode til en gitt form. Det finnes flere former, men den som hjelper oss med ornamenterte bokstaver er NFD - Normalization Form Decomposition. Denne formen bryter alle sammensatte tegn ned i en base-karakter og kombinerende “diakritiske tegn” (så som tilde og aksent).

Strenger kan normaliseres på følgende vis i Java:

import java.text.Normalizer;

String s1 = "El niño";
String s2 = Normalizer.normalize(s1, Normalizer.Form.NFD);

Tilsvarende i JavaScript:

var s1 = "El niño";
var s2 = s1.normalize("NFD")

Du kan gjerne printe ut resultatet, men du vil bli skuffet, for det er ingen synlig forskjell. Normaliseringen endrer kun på hvordan innholdet er representert. Det kan være at du ser forskjell på .length - litt avhengig av hvilken representasjon du startet med. Etter normaliseringen vil ihvertfall .length være 8 - som indikerer at tilden er skilt ut fra n-en.

Når dette er gjort er det bare å rydde unna kodepunktene fra U+0300 til U+036F:

var s = "El niño";
s.normalize("NFD").replace(/[\u0300-\u036F]/, "");
//=> "El nino"

Og der har du det! Et kjekt lite triks du kan bruke neste gang du skal lage en “slug” til en URL, søke bredt, eller gjøre andre former for tekstanalyse.

Christian

Om Søk, Java, JavaScript og Unicode

Jeg har skrevet mer om fulltekstsøk fra bunnen av i denne serien med bloggposter. Gikk du glipp av starten? Her er det første innlegget i serien:

Bokstavkjeks – den som leter skal finne!

Tenk, hele Ibsens samlede verker er å finne i en boks med bokstavkjeks. Omtrent den tilnærmingen skal vi nå ta idet vi lager en liten søkemotor i JavaScript for å forstå hvordan fulltekstsøk funker.