String.prototype.normalize pro bezpečnější porovnání řetězců

Dnes jsem objevil String.prototype.normalize metoda. Pokud máte co do činění s obsahem vytvářeným uživateli, pomůže vám to se spolehlivějším porovnáváním řetězců.

Dovolte mi ukázat vám rychlý příklad:

// pick a random word with a German Umlaut
const word = 'über';       // displayed as 'über'
console.log(word.length);  // 4

const alikeWord = 'u\u0308ber';  // displayed as 'über'
console.log(alikeWord.length);   // 5

console.log(word === alikeWord); // false

Jak vidíte, řetězce, které vypadají identicky, se mohou skládat z různých kódových bodů a jednotek. alikeWord používá kombinovanou diakritickou značku ke generování německé přehlásky ü – konkrétně používá KOMBINOVACÍ DIAERESI.

Ale tady je háček:přehláska ü má také svůj vlastní kódový bod Unicode. Zde máme dva způsoby, jak zobrazit stejný glyf, takže porovnání řetězců je složité.

K vyřešení tohoto problému můžete použít normalize k normalizaci řetězců.

const word = 'über';       // displayed as 'über'
console.log(word.length);  // 4

const alikeWord = 'u\u0308ber'.normalize(); // displayed as 'über'
console.log(alikeWord.length);              // 4

console.log(word === alikeWord); // true