導入
フロントエンド開発において、特に日本語のテキストを扱う際に「禁則処理」や「適切な位置での改行」に頭を悩ませた経験はありませんか?従来のJavaScriptでは、`split(”)`や正規表現を用いた無理のある制御が行われてきましたが、これらは多言語対応において非常に脆弱でした。今回紹介する「Intl.Segmenter」は、ブラウザ標準で提供される強力なテキスト分割APIです。これを使えば、単語や文、書記素単位で正確な分割が可能になり、UIの品質を飛躍的に向上させることができます。
基礎知識
`Intl.Segmenter`は、Unicode標準に基づいた「テキストセグメンテーション」を行うためのAPIです。主な特徴は、言語特有のルールを考慮できる点にあります。例えば、英語ならスペースで単語を区切りますが、日本語にはスペースがないため、単語の境界を判定するには辞書ベースの解析が必要です。`Intl.Segmenter`を使えば、`granularity`(粒度)オプションを指定することで、以下の単位でテキストを分解できます。
・`grapheme`:文字の形(絵文字の結合文字なども1つとして扱う)
・`word`:単語単位(日本語の形態素解析に近い)
・`sentence`:文単位
実装/解決策
実装は非常にシンプルです。まず`Intl.Segmenter`のインスタンスを生成し、対象の文字列を`segment()`メソッドに渡すだけです。返り値はイテレータ形式で取得できるため、`for…of`ループを使って簡単に各セグメントへアクセスできます。日本語の単語単位で分割したい場合は、`granularity: ‘word’`を指定するのが最も一般的です。
サンプルプログラム
以下のコードは、日本語の文章を単語単位に分解し、それぞれのセグメントを表示する実用的な例です。
// 日本語のテキスト
const text = "フロントエンド開発は楽しい!";
// 日本語用にセグメンターを初期化
const segmenter = new Intl.Segmenter('ja', { granularity: 'word' });
// セグメント処理を実行
const segments = segmenter.segment(text);
// 分割された内容をコンソールに出力
for (const segment of segments) {
// segment.segment: 分割された文字列そのもの
// segment.index: 文字列内の開始位置
// segment.isWordLike: 単語として認識されているか(句読点などを除外可能)
console.log(`単語: ${segment.segment}, 位置: ${segment.index}`);
}
応用・注意点
現場で活用する際の最大のメリットは、絵文字の取り扱いです。例えば、家族の絵文字(👨👩👧👦)は複数のUnicodeコードポイントで構成されていますが、従来の`split(”)`ではバラバラに分割されてしまいます。`Intl.Segmenter`で`granularity: ‘grapheme’`を指定すれば、これらを正しく1文字として認識可能です。
注意点として、`Intl.Segmenter`は比較的新しいAPIであるため、古いブラウザ(特にInternet Explorer)では動作しません。また、辞書ベースの判定を行うため、非常に長いテキストに対して高頻度で実行するとパフォーマンスに影響を与える可能性があります。必要な箇所でのみ使用し、処理コストを考慮した実装を心がけてください。