文字コード(Unicode)
はじめに
文字コードを意識し始めたのは恥ずかしながら、エンジニアになって数年経った頃合いでした。
当時はUTF-16 BOM付きと言われピンと来ずに、知識の浅さを痛感しました。
今回はUnicodeについて、記事にします。
Unicodeとは
Unicodeは「文字に一意の番号」を与える規格です。
それをバイト列に表す方式にUTF-8/UTF-16/UTF-32があります。
ひらがなに関しては、下記(pdf)に記載があり「あ」に関しては
3042 あ HIRAGANA LETTER A
と記載してあり、U+3042が「あ」となります。
予備知識
具体的な内容に入る前に、少しだけ予備知識を確認しておきます。
エンディアン
UTF-16とUTF-32には、エンディアンが設定されており、BE(ビッグエンディアン)とLE(リトルエンディアン)とがあります。
エンディアンとは、複数バイトで構成されるデータをメモリやファイル上に並べる順序の規則です。
最上位バイトを先に並べる方式をビッグエンディアン、最下位バイトを先に並べる方式をリトルエンディアンと呼びます。
CPUはどちらか一方の順序を採用しており、x86系はリトルエンディアンです。
文字コードでは、UTF-16やUTF-32がこの影響を受け、BOM(Byte Order Mark)で並び順を示します。
一方でUTF-8は1バイト単位で完結するため、エンディアンの概念がありません。
BOM (Byte Order Mark)
BOM(Byte Order Mark)は、Unicodeテキストの先頭に付く特別な符号(U+FEFF)で、ファイルのエンコーディング情報を自己的に記述する役割を持ちます。
UTF-16やUTF-32では、FE FFがビッグエンディアン、FF FEがリトルエンディアンを示します。
一方、UTF-8ではエンディアンの概念がないため、BOMは署名的な目印であり、互換性のため通常は付けません。
下記に、エンディアンについての記載があります(pdf)。
| Encoding | Scheme | Signature |
|---|---|---|
| UTF-8 | - | EF BB BF |
| UTF-16 | Big-endian | FE FF |
| UTF-16 | Little-endian | FF FE |
| UTF-32 | Big-endian | 00 00 FE FF |
| UTF-32 | Little-endian | FF FE 00 00 |
サロゲートとは
BMPの中にあるU+D800〜U+DFFFは、実際の文字には割り当てられていません。これが 「サロゲートペア専用の予約領域」 です。
| 範囲 | 名称 | 用途 |
|---|---|---|
| U+D800–DBFF | 上位サロゲート (High Surrogate) | 2ユニットペアの前半 |
| U+DC00–DFFF | 下位サロゲート (Low Surrogate) | 2ユニットペアの後半 |
UTF-8, UTF-16, UTF-32の関係
| 形式 | 1ユニット長 | BMP内文字 | BMP外文字 | エンディアン | サロゲート |
|---|---|---|---|---|---|
| UTF-8 | 8bit | 1〜3バイト | 4バイト | なし | なし |
| UTF-16 | 16bit | 1ユニット | 2ユニット(サロゲートペア) | BE/LEあり | あり |
| UTF-32 | 32bit | 1ユニット | 1ユニット | BE/LEあり | なし |
Unicodeの構造
| 面 | 名称 | 範囲 | 主な内容 |
|---|---|---|---|
| 0 | BMP (Basic Multilingual Plane) | U+0000–U+FFFF | 主要な文字・記号・CJK基本漢字など |
| 1 | SMP (Supplementary Multilingual Plane) | U+10000–1FFFF | 絵文字・古代文字など |
| 2 | SIP (Supplementary Ideographic Plane) | U+20000–2FFFF | 漢字専用 |
| 3 | TIP (Tertiary Ideographic Plane) | U+30000–3FFFF | 漢字+予備 |
| 4–13 | 予備 | — | 将来・特殊用途 |
| 14 | SSP (Supplementary Special-purpose Plane) | U+E0000–E0FFF | 言語タグなど |
| 15–16 | 私用面 (PUA-A/B) | U+F0000–10FFFF | 企業・個人定義領域 |
BMP
Plane 0(U+0000〜U+FFFF)がBMPにあたります。
主な内容
- ASCII(英数字・記号)
- ラテン・ギリシャ・キリル・アラビア・ヘブライ など主要アルファベット
- ひらがな・カタカナ・ハングル
- 基本漢字(CJK統合漢字U+4E00–9FFF)
- 記号類、句読点、制御文字
- 私用領域(U+E000–F8FF)
- サロゲート領域(U+D800–DFFF)
まとめ
今回はUnicodeについて簡単にまとめました、学習の補助に役立てていただけると幸いです。
参考情報
Discussion