世界中の文字を1つの体系で扱う国際的な文字コード規格
Unicode(ユニコード)とは、世界中のあらゆる文字を、たった1つの番号体系でまとめて表せるようにした国際的な文字コード規格です。英語・日本語・中国語・アラビア語はもちろん、記号や絵文字、古代の文字まで、すべての文字に重複しない固有の番号を割り当てています。
Unicodeが生まれた背景には、Shift_JIS・EUC-JPなど「国ごと・環境ごとにバラバラの文字コードがあって文字化けが多発した」問題があります。同じ番号でも国によって違う文字を表していたため、データをやり取りすると文字が壊れたのです。そこで「世界中の文字を1つの表に統合してしまえば文字化けは起きない」という発想で作られました。
身近な例で言うと、世界中の電話番号を「国際電話番号」として1つの体系にまとめたのに似ています。どの国の文字でも世界共通の番号で指せるので、相手の国や機種を気にせず文字をやり取りできます。上の図解では、各文字に振られる番号(コードポイント)と、それを実際のデータにする方法をまとめています。
コードポイントとは、Unicodeが1文字に割り当てる固有の番号のことです。U+ に続けて16進数で書く決まりで、たとえば「A」は U+0041、「あ」は U+3042、絵文字の「😀」は U+1F600 です。
ここで大切なのが「コードポイントは文字に振られた番号にすぎず、実際のバイト列とは別物」という点です。U+3042 はあくまで「あ」の住所であって、それをコンピュータに保存・送信するときに何バイトでどう並べるかは、後述のエンコーディング(UTF-8など)が決めます。「番号付けの仕様」と「バイトへの変換方法」を分けて考えるのがUnicodeの基本です。
膨大な数のコードポイントは「面(プレーン)」という単位に分けて整理されています。
・基本多言語面(BMP / 第0面):U+0000〜U+FFFF の65,536文字。世界の主要な文字(ラテン・かな・漢字など)がほぼここに収まる
・補助面(第1〜16面):U+10000〜U+10FFFF。BMPに入りきらない絵文字・古代文字・珍しい漢字など
・全体の範囲:U+0000〜U+10FFFF(約111万のコードポイント)
身近な例で言うと、巨大な図書館を「フロア(面)」と「棚番号(コードポイント)」で管理するイメージです。日常的に使う本(文字)は1階(BMP)にまとまっており、専門書や珍しい資料(絵文字・古代文字)は上の階(補助面)にある──そう考えると整理しやすいです。基本となるのは「BMP=U+0000〜U+FFFF」「コードポイントはU+で表す」という点です。
Unicodeは「どの文字にどの番号を振るか」を決める仕様であり、その番号(コードポイント)を実際のバイト列に変換する方法がUTF(Unicode Transformation Format)です。UTFには主に3種類あり、いずれも同じUnicodeのコードポイントを、違うバイトの並べ方で表したものです。
| 方式 | 1文字のバイト数 | 特徴 | 主な用途 |
|---|---|---|---|
| UTF-8 | 1〜4バイト(可変長) | ASCII互換・省サイズ | Web・ファイルの標準 |
| UTF-16 | 2 or 4バイト | BMPは2バイト固定 | Windows・Java内部 |
| UTF-32 | 常に4バイト固定 | 計算が単純・容量大 | 内部処理(限定的) |
3つの違いは「1文字を何バイトで表すか」です。
・UTF-8:よく使う文字を少ないバイトで表す可変長。ASCIIは1バイトで互換性があり、現在のWebやファイルの標準
・UTF-16:BMPの文字を2バイト、補助面の文字を4バイト(サロゲートペア)で表す
・UTF-32:どの文字も4バイト固定。1文字=4バイトと単純だが容量を多く使う
身近な例で言うと、同じ住所(コードポイント)を、ハガキ・封筒・宅配伝票という別々の用紙に書くようなものです。書く中身(指す文字)は同じでも、用紙(UTF-8/16/32)によって書き方やサイズが変わります。「Unicode=文字の番号付け」「UTF-8/16/32=その符号化方式」「UTF-8が最も普及」という関係を区別して理解しておくことが大切です。