Unicodeとは?コードポイントと文字コードの仕組みを解説
この記事の要点
- Unicodeは、世界中の文字や記号に共通の番号を割り当てる規格です。
- 文字に割り当てられた番号をコードポイントと呼び、
U+3042のように表します。 - コードポイントと、UTF-8・UTF-16で保存されるデータは別のものです。
Unicodeとは何か
Unicodeは、日本語、英語、漢字、記号、絵文字などをコンピュータで一貫して扱うための文字集合の規格です。環境ごとに異なる番号で文字を管理すると、送信側と受信側の対応がずれて文字化けが起こります。Unicodeは文字ごとに共通の番号を定め、この食い違いを減らします。
文字「あ」 → コードポイント U+3042文字「😀」 → コードポイント U+1F600ここで重要なのは、Unicodeが「文字と番号の対応」を定め、UTF-8やUTF-16が「その番号をデータとして表す方法」を定めるという区別です。
ASCIIとUnicodeの関係
ASCIIは英字、数字、基本記号、制御文字を0〜127へ割り当てた文字コードです。Unicodeの先頭128コードポイントはASCIIと同じ割り当てになっています。
| 文字 | ASCII 10進数 | ASCII 16進数 | Unicode |
|---|---|---|---|
| A | 65 | 41 | U+0041 |
| a | 97 | 61 | U+0061 |
| 0 | 48 | 30 | U+0030 |
| 改行 LF | 10 | 0A | U+000A |
そのためASCIIだけで構成されたテキストは、UTF-8でも同じ1バイトの値になります。一方、ひらがなや漢字はASCIIの範囲外です。
コードポイントとU+表記
コードポイントはUnicodeの文字に割り当てられた整数です。通常はU+の後ろへ16進数を続けます。U+表記はバイト列ではなく、文字の識別番号です。
| 文字 | コードポイント | 10進数 | 分類 |
|---|---|---|---|
| A | U+0041 | 65 | 基本ラテン文字 |
| あ | U+3042 | 12354 | ひらがな |
| 漢 | U+6F22 | 28450 | CJK統合漢字 |
| 😀 | U+1F600 | 128512 | 絵文字 |
Unicodeの範囲と平面
Unicodeコードポイントの範囲はU+0000〜U+10FFFFで、65,536個ずつの17平面に分けられます。日常的に使う文字の多くは基本多言語面(BMP)にあり、範囲はU+0000〜U+FFFFです。
- 基本多言語面(BMP):ラテン文字、ひらがな、カタカナ、多くの漢字などを収録します。
- 補助平面:一部の絵文字、追加漢字、歴史的文字などを収録します。
- サロゲート領域:U+D800〜U+DFFFはUTF-16の組み合わせに使うため、単独の文字には割り当てません。
「1文字」とコードポイント数は同じとは限らない
画面上で1文字に見える単位と、コードポイント1個は必ずしも一致しません。たとえば「が」は単独のU+304Cでも、「か」U+304Bと結合濁点U+3099の2コードポイントでも表せます。
が = U+304Cが = U+304B U+3099さらに、家族の絵文字や国旗は複数のコードポイントを組み合わせて1つの見た目を作ることがあります。文字数を数える処理では、コードポイント数だけでなく書記素クラスタも考慮する必要があります。
NFC・NFDによるUnicode正規化
見た目が同じでもコードポイント列が異なる文字列を、用途に応じた形へそろえる処理がUnicode正規化です。NFCは可能な文字を合成し、NFDは基底文字と結合文字へ分解します。
画面上で同じ「が」に見えても、内部のコードポイント列が違えば単純比較で一致しない場合があります。検索、ファイル名、重複判定では正規化形式をそろえてください。
よくある質問
Unicodeとは簡単にいうと何ですか?
世界中の文字や記号へ一意のコードポイントを割り当て、異なる環境でも同じ文字を扱えるようにする文字集合の規格です。
U+3042とは何を表していますか?
ひらがなの「あ」に割り当てられたUnicodeコードポイントです。U+の後ろは16進数で、3042は10進数では12354です。
Unicodeの1文字は必ず1コードポイントですか?
必ずしもそうではありません。濁点などの結合文字や一部の絵文字は、複数のコードポイントを組み合わせて1つの文字のように表示されます。
ASCIIとUnicodeには互換性がありますか?
はい。UnicodeのU+0000〜U+007FはASCIIと同じ文字と値に対応しています。