Unicode
世界中の文字を統一的に扱うための文字コード規格。14 万字以上の文字を収録する。
Unicode は、世界中のあらゆる文字を一つの体系で表現するための国際的な文字コード規格です。Unicode Consortium が策定・管理しており、2024 年リリースの Unicode 16.0 では 15 万字以上の文字が収録されています。ラテン文字、漢字、アラビア文字、デーヴァナーガリー文字といった現用の文字体系に加え、絵文字、楔形文字、ヒエログリフなどの古代文字も含まれています。
Unicode 以前は、言語や地域ごとに異なる文字コードが乱立していました。日本語には Shift_JIS、EUC-JP、ISO-2022-JP、中国語には GB2312、Big5、韓国語には EUC-KR など、それぞれ独自の文字コードが使われていました。異なる文字コード間でテキストをやり取りすると文字化けが発生し、多言語テキストを 1 つのファイルで扱うことは事実上不可能でした。Unicode の登場により、すべての文字を 1 つのコード体系で表現できるようになり、この問題が根本的に解決されました。Unicode の解説書で詳しく学べます。
Unicode の実装方式 (エンコーディング) には UTF-8、UTF-16、UTF-32 の 3 種類があります。UTF-8 は可変長 (1〜4 バイト) で ASCII 互換性があり、Web の事実上の標準です。UTF-16 は 2 バイトまたは 4 バイトで表現し、JavaScript や Java の内部文字列表現に使われています。UTF-32 は固定長 4 バイトで処理は単純ですが、メモリ効率が悪いため実用ではほとんど使われません。
Unicode の構造を理解するうえで重要な概念がコードポイントです。各文字には U+0000 から U+10FFFF までの範囲でコードポイントが割り当てられています。基本多言語面 (BMP, U+0000〜U+FFFF) には日常的に使う文字のほとんどが含まれ、追加面 (U+10000 以降) には絵文字、古代文字、珍しい漢字などが配置されています。BMP 外の文字は UTF-16 ではサロゲートペアとして 2 つのコードユニットで表現されるため、プログラミングでの文字数カウントに影響します。
よくある誤解として、「Unicode = UTF-8」と考えてしまうケースがあります。Unicode は文字とコードポイントの対応を定めた規格であり、UTF-8 はその実装方式の一つです。また、「1 文字 = 1 コードポイント」とも限りません。結合文字 (例: 「が」= 「か」+ 濁点) や絵文字の ZWJ シーケンス (例: 家族の絵文字) は、複数のコードポイントで 1 つの表示文字を構成します。文字コード技術の書籍では、プログラミングでの Unicode の正しい扱い方が解説されています。
文字数カウントとの関連では、Unicode の複雑さが「文字数」の定義を曖昧にしています。JavaScript の String.length は UTF-16 コードユニット数を返すため、絵文字は長さ 2 になります。正確な文字数を得るには、書記素クラスタ (grapheme cluster) 単位でカウントする必要があり、JavaScript では Intl.Segmenter API が利用できます。文字数カウントツールでは、コードポイント数、UTF-16 コードユニット数、書記素クラスタ数のどれを「文字数」とするかを明確にすることが重要です。