⚗️

文字コード(Unicode)

に公開

はじめに

文字コードを意識し始めたのは恥ずかしながら、エンジニアになって数年経った頃合いでした。
当時はUTF-16 BOM付きと言われピンと来ずに、知識の浅さを痛感しました。
今回はUnicodeについて、記事にします。

Unicodeとは

Unicodeは「文字に一意の番号」を与える規格です。
それをバイト列に表す方式にUTF-8/UTF-16/UTF-32があります。
ひらがなに関しては、下記(pdf)に記載があり「あ」に関しては

3042 あ HIRAGANA LETTER A

と記載してあり、U+3042が「あ」となります。
https://www.unicode.org/charts/PDF/U3040.pdf

予備知識

具体的な内容に入る前に、少しだけ予備知識を確認しておきます。

エンディアン

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)。
https://www.unicode.org/versions/Unicode12.1.0/ch23.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について簡単にまとめました、学習の補助に役立てていただけると幸いです。

参考情報

https://www.unicode.org/versions/Unicode17.0.0/core-spec/chapter-3/
https://datatracker.ietf.org/doc/html/rfc3629
https://www.rfc-editor.org/rfc/rfc2781.html

Discussion