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

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

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

  • 符号化文字集合(Coded Character Set)
  • 文字符号化方式(Character Encoding Scheme)
関連記事:Linux の基本機能
スポンサーリンク

符号化文字集合 Coded Character Set

符号化文字集合(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

上記の「文字 "!"」は「コード "0x21 (16 進数の 21)"」であることがわかります。

符号化文字集合は、対応表が持つ文字の種類によって、以下の種類が存在します。

  • 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

文字符号化方式 (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 と互換性を持たせつつ、漢字の表現も可能としています。

符号化文字集合説明
JIS X 02011 バイト (= 256) の符号化文字集合(ASCIIとの互換のため)

256 通りしか文字を表現できないので、漢字を表現するには組み合わせが不足
JIS X 02082 バイト (= 65, 536) の符号化文字集合

65,536 通りの文字を表現できるため、多くの漢字をコードに割り当て可能

Shift-JIS 文字コード一覧

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

EUC-JP 文字コード一覧

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

UTF-8 文字コード一覧

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) -->バイト列 (UTF-8)

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

バイナリを文字として表示したい

od コマンドを使いましょう。

sudo nkf -g /var/lib/mysql/ib_logfile0
BINARY

od -a <ファイルパス> で、バイナリを文字で確認します。

sudo od -a /var/lib/mysql/ib_logfile0
0000000 nul nul nul soh nul nul nul nul nul nul nul nul nul nul nul nul
0000020   M   y   S   Q   L  sp   5   .   7   .   2   4 nul nul nul nul
(省略)

"MySQL 5.7.24" と記録されていることが確認できます。

関連情報

関連記事:Linux の基本機能