ICU (International Components for Unicode)

Unicode の国際化ライブラリ。文字列の照合・変換・書式設定など多言語処理の基盤を提供する。

ICU (International Components for Unicode) は、Unicode コンソーシアムが開発・保守する国際化 (i18n) ライブラリです。C/C++ 版 (ICU4C) と Java 版 (ICU4J) が提供されており、OS やブラウザ、プログラミング言語のランタイムなど、多くのプラットフォームの多言語処理基盤として採用されています。Android、iOS、macOS、Windows、Chrome、Firefox など、日常的に使われるソフトウェアの内部で ICU が動作しています。

ICU が提供する機能は多岐にわたります。文字列の照合 (ロケール対応のソート) では、言語ごとに異なるアルファベット順序を正確に処理します。たとえばスウェーデン語では「ö」が「z」の後に来ますが、ドイツ語では「o」の変種として扱われます。日付・数値・通貨の書式設定では、「2025/01/15」を英語圏では「January 15, 2025」、ドイツ語圏では「15. Januar 2025」と表示するような変換を行います。Unicode 国際化ライブラリの書籍で ICU の全体像を学べます。

テキスト境界検出 (BreakIterator) は、文字数カウントと特に関連の深い機能です。単語の区切り、文の区切り、行の折り返し位置を言語に応じて正確に判定します。日本語や中国語のようにスペースで単語を区切らない言語では、辞書ベースの解析が必要であり、ICU はこの処理を内部で行っています。JavaScript の Intl.Segmenter API は ICU のテキスト境界検出機能を Web に公開したものです。

Node.js は v13 以降、ICU のフルデータセットをデフォルトで同梱しており、Intl API の内部実装に ICU が使われています。それ以前のバージョンでは ICU データが部分的にしか含まれず、一部のロケールで正しく動作しない問題がありました。ブラウザでも Intl.CollatorIntl.DateTimeFormatIntl.NumberFormat などの API が ICU を基盤としています。

ICU の照合アルゴリズム (UCA: Unicode Collation Algorithm) は、ロケールごとに異なるソート順序を多段階の比較レベルで処理します。第 1 レベルは基本文字の比較、第 2 レベルはアクセント記号の比較、第 3 レベルは大文字・小文字の比較という階層構造になっています。この仕組みにより、「cafe」と「café」を同一視するか区別するかをアプリケーションの要件に応じて制御できます。ソフトウェア国際化の書籍で照合アルゴリズムの詳細を習得できます。

文字数カウントとの関連では、ICU の書記素クラスタ (grapheme cluster) 分割機能が重要です。絵文字の家族シーケンス (👨‍👩‍👧‍👦) や結合文字を含むテキストで「ユーザーが認識する 1 文字」を正確にカウントするには、ICU のような高度なテキスト処理ライブラリが不可欠です。単純なコードポイント数やバイト数では正確な文字数を得られない場面で、ICU の機能が真価を発揮します。