Unicode
世界中の文字を統一的に扱うための文字コード規格。15 万字以上の文字を収録する。
Unicode は、世界中のあらゆる文字を一つの体系で表現するための国際的な文字コード規格です。Unicode Consortium が策定・管理しており、2025 年 9 月に公開された Unicode 17.0 では 159,801 文字 (図形文字と書式文字の合計) が収録されています。ラテン文字、漢字、アラビア文字、デーヴァナーガリー文字といった現用の文字体系に加え、絵文字、楔形文字、ヒエログリフなどの古代文字も含まれています。版はおおむね年 1 回のペースで上がり、そのたびに文字が追加されるため、収録字数を根拠にする文書では版番号を併記しておくと後から読み違えが起きません。
Unicode 以前は、言語や地域ごとに異なる文字コードが乱立していました。日本語には Shift_JIS、EUC-JP、ISO-2022-JP、中国語には GB2312、Big5、韓国語には EUC-KR など、それぞれ独自の文字コードが使われていました。異なる文字コード間でテキストをやり取りすると文字化けが発生し、多言語テキストを 1 つのファイルで扱うことは事実上不可能でした。Unicode の登場により、すべての文字を 1 つのコード体系で表現できるようになり、この問題が根本的に解決されました。
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 つの表示文字を構成します。同じ見た目の文字に複数の表し方があることは実務でも問題になります。たとえば macOS 上で作られたファイル名は濁点が分解された形で保存されることがあり、合成済みの形で入力した文字列と検索して一致しない、重複が別物として登録される、といった症状につながります。文字列を突き合わせる処理では、比較の前に正規化形式をそろえておくのが定石です。
文字数カウントとの関連では、Unicode の複雑さが「文字数」の定義を曖昧にしています。JavaScript の String.length は UTF-16 コードユニット数を返すため、BMP 外の絵文字は長さ 2 になります。人が見たままの文字数を得るには書記素クラスタ (grapheme cluster) 単位でカウントする必要があり、JavaScript では Intl.Segmenter API が利用できます。どれを採用するかは用途で決まります。入力欄の残り文字数表示なら書記素クラスタ、データベースの桁あふれを避けたいならバイト数、既存プログラムの挙動に合わせるならコードユニット数です。同じ文章でも数え方によって値が変わるため、上限を決めるときは「何を 1 文字と数えるか」を先に決めておく必要があります。