JavaScript/String/prototype/normalize
String.prototype.normalize()
は、文字列の Unicode 正規化形式を返すメソッドです。このメソッドは、文字列のテキスト比較や検索の整合性を確保するために使用されます[1]。
構文
編集str.normalize([form])
form
: 正規化形式を指定する文字列。以下の値のいずれかを指定できます(省略可能)。
*"NFC"
: 正規形式 C(標準合成、デフォルト) *"NFD"
: 正規形式 D(標準分解) *"NFKC"
: 互換正規形式 C(互換合成) *"NFKD"
: 互換正規形式 D(互換分解)
例
編集基本的な使用法
編集以下のプログラムは、String.prototype.normalize()
を使用して文字列を正規化します。
const str1 = '\u00F1'; // ñ const str2 = '\u006E\u0303'; // ñ (n + 結合用チルダ) console.log(str1); // ñ console.log(str2); // ñ console.log(str1 === str2); // false const normalized1 = str1.normalize(); const normalized2 = str2.normalize(); console.log(normalized1 === normalized2); // true
このプログラムでは、2つの異なる方法で表現された「ñ」文字が、正規化によって同じ文字列として扱われるようになることを示しています。
異なる正規化形式の比較
編集以下のプログラムは、異なる正規化形式を使用した場合の結果を比較します。
const str = '\u1E9B\u0323'; // ẛ̣ (長いsとダイアクリティカルマーク) console.log(str.normalize('NFC')); // 単一の合成形式 console.log(str.normalize('NFD')); // 完全分解形式 console.log(str.normalize('NFKC')); // 互換合成形式(小文字のsに変換) console.log(str.normalize('NFKD')); // 互換分解形式(小文字のsに変換して分解)
このプログラムでは、様々な正規化形式が文字列にどのように影響するかを示しています。特に、互換形式では文字の見た目が変わる場合があります。
文字列検索における正規化の重要性
編集以下のプログラムは、文字列検索における正規化の重要性を示します。
const text = 'café'; // 'e' と結合アクセント const searchTerm = 'cafe\u0301'; // 'e' + 結合アクセント console.log(text.includes(searchTerm)); // false - 正規化なしでは一致しない console.log(text.normalize().includes(searchTerm.normalize())); // true - 正規化後は一致する
このプログラムでは、異なる方法で表現された文字列の検索が、正規化によって正しく機能するようになることを示しています。
注意点
編集- デフォルト値:
form
パラメータを省略した場合、デフォルトでは"NFC"
が使用されます。 - 無効な引数:
form
パラメータに無効な値を指定すると、RangeError
が発生します。 - 正規化の必要性: 正規化は、国際化されたアプリケーションや、複数の言語をサポートするアプリケーションで特に重要です。
- パフォーマンス: 大量のテキストの正規化は、処理時間を要する場合があります。
脚註
編集- ^ これは、異なる文字表現を標準化された形式に変換するために使用されます。
外部リンク
編集- ECMA-262::22.1.3.15 String.prototype.normalize ( [ form )]
- Unicode Standard Annex #15 - Unicode Normalization Forms