文字、番号、バイト:3つの段階
W3Cの解説によると、文字コードの話は次の3つの段階に分けると理解しやすくなります [K1][K2]。
- 文字:「á」「請」「ह」のような、ひとつひとつの文字。必要な文字をまとめたものを「文字集合」という
- コードポイント:文字集合の中で、ひとつひとつの文字に割り当てられた一意の番号
- バイト:コンピューターの中に保存されるときの実際のデータ。ふつう、1バイトは8ビット
そして、文字コード(文字符号化)は「番号をどんなバイトの並びにするか」の決まりです [K2]。同じ番号でも、文字コードが違えば保存されるバイトが変わります。
文字コードの種類が多いと、何が困るのか
W3Cは例を挙げています。
ISO 8859-1(ラテン文字用)では、番号233は「é」を表します。
ところが、ISO 8859-5(キリル文字用)では、同じ番号233が、まったく別の文字「щ」になります。
バイトの値だけではどの文字か決まらず、「どの文字コードか」という前提によって意味が変わるのです [K1]。
Unicodeと、UTF-8・UTF-16・UTF-32
Unicodeは、世界中の文字を1つの文字集合に収めた規格です。
W3Cは、Unicodeには必要になりそうな文字がほぼ全部入っていると説明しています [K1]。
ただし、Unicodeは「番号の割り当て」で、実際にバイトに変える方法は別に決まっています。代表的な方法がUTF-8、UTF-16、UTF-32です [K1][K3]。
W3Cの例では、同じ文字(デーヴァナーガリー文字の「क」)がUTF-16では2バイト、UTF-8では3バイト、UTF-32では4バイトになります [K1]。
UTF-8の特徴
IETFのRFC 3629(インターネット標準)は、UTF-8の特徴を、次のように説明しています [K3]。
- ASCII(英数字など)の範囲がそのまま保たれる:英数字などは、昔と同じ1バイトで表される。そのため、ASCIIを前提にした古いファイルシステムや、解析のプログラムとも互換性がある
- 文字によってバイト数が変わる:U+0000からU+10FFFFまでの文字は、1〜4バイトの並びで表される
W3Cは、UTF-8では英数字(ASCII)だけが1バイトで、他の多くの文字は2〜4バイトになると説明しています。たとえば「é」も、UTF-8では2バイトです [K1]。
注記:日本語の「あ」がUTF-8で3バイトになるのは、
UTF-8の規則(RFC 3629)から導かれる、私の補足です。
上の資料では、日本語の例そのものは確認していません。
一方、Shift_JISでは、日本語の文字は2バイトで表されます(詳細②)。
UTF-8がすすめられる理由
W3Cは、UTF-8はWebページでUnicodeを表す方法として最も広く使われていると述べ、Webページやデータベースを作るときは常にUTF-8を使うべきだとしています [K1]。
WHATWGの標準も、UTF-8がUnicodeのやり取りに最も適した文字コードだと説明しています [K4]。
参照元
[K1] W3C Internationalization, Character encodings for beginners — https://www.w3.org/International/questions/qa-what-is-encoding
[K2] W3C Internationalization Working Group, Internationalization Glossary — https://w3.org/TR/2023/DNOTE-i18n-glossary-20231014
[K3] IETF, RFC 3629: UTF-8, a transformation format of ISO 10646(STD 63) — https://datatracker.ietf.org/doc/html/rfc3629
[K4] WHATWG, Encoding Standard — https://encoding.spec.whatwg.org/

コメント