文字コード概要
文字コードに対する基本的なところを勉強中。
基本的な文字コード(文字符号化方式)の一覧は以下の通り。
「文字符号化方式」と「符号化文字集合」の違いは後述。
文字コード名 (文字符号化方式) | 符号化文字集合 | ビット数 | 「a」表現 | 「あ」表現 | 備考 |
---|
ASCII | ASCII | 8ビット | 0x61 | (表現不可) | 基本となる文字コード。8ビットの内最後の1ビットはパリティビット |
JIS | JIS X 0201 JIS X 0208 JIS X 0211 | 8ビット 16ビット 24ビット | 0x61 | 0x2422 | 正式名称は「ISO-2022-JP」 ASCIIコードをベースに日本語を扱えるようにした文字コード しかし仕様上、ASCII文字と日本語文字が混在するとデータ量が増えるという問題を抱えている |
SHIFT-JIS | JIS X 0201 JIS X 0208 | 8ビット 16ビット | 0x61 | 0x82a0 | JISコードの問題点を解消した文字コード JISと比較し一部使えない漢字がある |
EUC-JP | ASCII JIS X 0201 JIS X 0208 | 8ビット 16ビット | 0x61 | 0xa4a2 | UNIX上で日本語を扱えるようにした文字コード |
UTF-8 | Unicode | 8ビット~ | 0x61 | 0xE38182 | 現在の世界的な主流 ASCIIをそのまま置き換えることができる 可変長のビット長で例えば日本語の文字は3~4バイトで表されたりする |
UTF-16 | Unicode | 16ビット~ | 0x0061 | 0x3042 | UTF-8と同じ符号化文字集合「Unicode」を使う文字符号化方式 サイズの基本単位が16ビット(2バイト)で、「a」なども2バイトで表される。 |
符号化文字集合と文字符号化方式
文字コードと一言でいうが、実際にはざっくり2つのプロセスを踏まえて文字をビットに置き換えている。
1つ目は、例えば「あ」という文字を「1」という数字に置き換える作業。どの文字をどの数値に置き換えるかの対応表を
「符号化文字集合」という。
この符号化文字集合でカバーできない文字がある場合、その文字はその文字コードにおいて使用できないということになる。
2つ目のプロセスは、「1」という数字を実際のビット列に置き換える作業。この時どのようにビット列に置き換えるかの方式を
「文字符号化方式」という。
「UTF-8」や「UTF-16」は符号化文字集合こそ同じ「Unicode」を使っているが、符号化方式が異なるため最終的なビット列は異なるものになる。
この「文字符号化方式」を文字コードと呼ぶ(厳密には文字コードという言葉をその2つに紐づけることはできないらしいが、そう考えた方が分かりやすい)
実例
ここで「UTF-8」と「UTF-16」でひらがなの「あ」を符号化する。
【UTF-8の場合】
1.「あ」を「Unicode」に従い、「0x3042」に変換する
(あ ⇒ 0x3042)
↓
2.「0x3042」を2進数に置き換える
(0x3042 ⇒ 0011000001000010)
↓
3.下位ビットから6ビットずつセパレートする
(0011000001000010 ⇒ 0011 000001 000010)
↓
4.各ビット列の頭に「10」を付ける
(0011 000001 000010 ⇒ 100011 10000001 10000010)
↓
5.先頭のビット列が8桁になるように、頭に「1」埋めをする
(100011 10000001 10000010 ⇒ 11100011 10000001 10000010)
↓
6.16進数に戻す
(100011 10000001 10000010 ⇒ 0xE3 0x81 0x82 ⇒ 0xE38182)
【UTF-16の場合】
1.「あ」を「Unicode」に従い、「0x3042」に変換する
(あ ⇒ 0x3042)
↓
2.2バイト文字はそのまま符号化する
(0x3042 ⇒ 0x3042)
(【リトルエンディアンの場合】0x3042 ⇒ 0x4230)
ビッグエンディアンとリトルエンディアン
「UTF」系列の文字コードでは、同じ文字コードでも
「ビッグエンディアン」と
「リトルエンディアン」という区別を持つ。
違うのはビット列(バイト)の並び順。
例えばUTF-16だと「あ」は「0x3042」と表されるが、これを後ろのバイトから並べ直す、つまり「30」と「42」をひっくり返すと「0x4230」というビット列になる。
このひっくり返したものが「リトルエンディアン」で、ひっくり返す前のものが「ビッグエンディアン」になる。
2つをデータ上で区別する方法だが、テキストデータの先頭に特定のビット列を付与することで行う。もしくは文字コードで元からどちらを使用するかを区別するようにもできる。
このテキストデータの先頭に付与したビット列を
「BOM」(Byte Order Mark)と言う。
文字コード | エンディアン | BOMの有無 | BOM |
---|
UTF-8 | ビッグ | 省略可能 | 0xEFBBBF |
UTF-8N | ビッグ | 無し | |
UTF-16 | ビッグ | 省略可能 | 0xFEFF |
UTF-16 | リトル | 省略可能(非推奨) | 0xFFFE |
UTF-16BE | ビッグ | 無し | |
UTF-16LE | リトル | 無し | |
UTF-32 | ビッグ | 省略可能 | 0x0000FEFF |
UTF-32 | リトル | 省略可能(非推奨) | 0xFFFE0000 |
UTF-32BE | ビッグ | 無し | |
UTF-32LE | リトル | 無し | |