文字コードとは?一覧表や確認方法や変換コマンド等について

スポンサーリンク
Linux

文字コードとは

文字コードとは、各文字に割り当てられたデータ列(バイト列)のことです。

文字コードは以下の2段階に区別されます。

  • 符号化文字集合(Coded Character Set)
  • 文字符号化方式(Character Encoding Scheme)

符号化文字集合 Coded Character Set

符号化文字集合とは、特定の種類ごとに集めた文字とコード(符号)の対応表(集合)のことです。

文字とコードの対応表の例(ASCII)
_0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F
0−NULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSI
1−DLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUS
2−SP!"#$%&'()*+,-./
3−0123456789:;<=>?
4−@ABCDEFGHIJKLMNO
5−PQRSTUVWXYZ[\]^_
6−`abcdefghijklmno
7−pqrstuvwxyz{|}~DEL

符号化文字集合の一例は以下のとおりです。

  • ASCII(アルファベットや数字等を集めた対応表)
  • JIS X(日本語で利用する文字を集めた対応表)
  • Unicode(全世界のすべての文字や記号等を集めた対応表)

なお、同じコードでも符号化文字集合の種類によって以下のように割り当てられている文字が異なります。

そのため、利用する符号化文字集合によって表示する文字が変化します。

このように、国ごとに符号化文字集合を変更することで表現できる文字を切り替えていましたが、とても不便なので全世界のすべての文字を対応表に詰め込んだ Unicode と呼ばれる符号化文字集合が作成されました。

ASCII コード一覧

ASCII コードの一覧を以下の順で記載したものを掲載します。

_0_1_2_3_4_5_6_7_8_9_A_B_C_D_E_F
0−NULSOHSTXETXEOTENQACKBELBSHTLFVTFFCRSOSI
1−DLEDC1DC2DC3DC4NAKSYNETBCANEMSUBESCFSGSRSUS
2−SP!"#$%&'()*+,-./
3−0123456789:;<=>?
4−@ABCDEFGHIJKLMNO
5−PQRSTUVWXYZ[\]^_
6−`abcdefghijklmno
7−pqrstuvwxyz{|}~DEL

初めの32文字と最後の1文字は制御文字と呼ばれており、各制御文字の説明は以下のwiki に載っています。

制御文字 - Wikipedia

JIS X 0201 コード一覧

JIS X 0201 コードの一覧は以下の wiki に記載があります。

JIS X 0201 - Wikipedia
JIS X 0201 - Wikipedia

Unicode コード一覧

Unicode コードの一覧は以下の wiki に記載があります。

Unicode一覧 0000-0FFF - Wikipedia

文字符号化方式 Character Encoding Scheme

文字符号化方式は、符号(コード)とデータ列(Byte 列等)との対応表のことです。

文字符号化方式の一例は以下のとおりです。

文字符号化方式利用する符号化文字集合説明
Shift-JISJIS X 0201、 JIS X 2008Windows では、日本語を表現するときに Shift-JIS の拡張版を用いる
EUC-JPJIS X 0208、JIS X 0212UNIX などで、日本語を表現するときに用いる
UTF-8Unicode, ISO/IEC 10646現在の主流
なしASCII, ISO-8859, JIS X 0201コードと Byte 列が同じため、対応表でエンコードする必要がない

文字符号化方式は、複数の符号化文字集合を組み合わせることができるため、利用可能な文字数を広げることができます。

例えば、Shift-JIS では「JIS X 0201」と「JIS X 0208」を組み合わせることで ASCII と互換性(HTTP や SMTP 等で使える)をもたせつつ、漢字表現も可能としています。

  • JIS X 0201:1バイトの符号化文字集合(ASCIIとの互換のため)
    • 2^8(1Byte)= 256 通りしか文字を表現できないので、漢字に表現するには組み合わせが少ない
  • JIS X 0208:2バイトの符号化文字集合
    • 2^16(2Bytes)= 65,536 通りの文字を表現できるため、多くの漢字をコードに割り当て可能

Shift-JIS 文字コード一覧

文字コード表 シフトJIS(Shift_JIS)

EUC-JP 文字コード一覧

文字コード表 日本語EUC(euc-jp)

UTF-8 文字コード一覧

UTF-8の文字コード表 - 備忘帳 - オレンジ工房

文字のエンコード

「符号化文字集合」と「文字符号化方式」を使って文字をエンコードしてみます。

今回は「符号化文字集合」に Unicode, 「文字符号化方式」に UTF-8 を利用して以下のようにエンコードします。

文字-->コード(Unicode)-->バイト列(UTF-8)

文字コード(Unicode)バイト列(UTF-8)
U+3042b'\xe3\x81\x82'
U+3044b'\xe3\x81\x84'
U+3046b'\xe3\x81\x86'
U+3048b'\xe3\x81\x88'
U+304Ab'\xe3\x81\x8a'

Unicode で文字からコードに変換

検証には python 3.6.8 を利用します。

python3
Python 3.6.8 (default, Aug 10 2019, 06:54:07)
'あ'.encode('unicode-escape')
b'\\u3042'

以下のリンクから、Unicode U+3042 は "あ" であることがわかります。

Unicode一覧 3000-3FFF - Wikipedia

UTF-8 でコードからバイト列に変換

'\u3042'.encode('UTF-8')
b'\xe3\x81\x82'

以下のリンクから、UTF-8 の3バイトのバイト列(e3 81 82)は "あ" であることがわかります。

UTF8 3byte (e3)

文字コードの確認、変換ツール

文字コード確認、変換には、nkf コマンドを使いましょう。

nkf コマンドのインストール

sudo yum install epel-release
sudo yum install nkf

nkf コマンドの使い方

文字コードを確認 -g

nkf -g test.txt
#結果
UTF-8

ただし、後述するように判定が甘い場合もあるので注意してください。

文字コードを変換 {-s, -e, -w} --overwrite

nkf -s --overwrite test.txt
nkf -g test.txt
#結果
Shift_JIS

文字コードに対応するオプションは以下のとおりです。

文字コードオプション
Shift-JIS-s
EUC-JP-e
UTF8-w(BOM成し),-w8(BOMあり)
UTF-16-w16(BOM無し),-w16B(BOMあり)

文字コードの判定がガバいんだけど?

確実な確認方法は無いらしい。

テキストファイルには文字コードを判別する仕組みがない(BOMを除く)。

「XXというバイトは、文字コードYYYにしか出現しないから、文字コードはYYYだ!」という判別方法。

文字列が短いと判別に失敗しやすい。

自動判別は確実ではない

https://qiita.com/yuji38kwmt/items/b3a7820b4d3b544da4ff#%E6%96%87%E5%AD%97%E3%82%B3%E3%83%BC%E3%83%89%E3%81%AE%E8%87%AA%E5%8B%95%E5%88%A4%E5%88%A5
0

コメント