文字コードってなんかややこしいですよね。
なので、いつでも思い出せるようにメモを残しておこうと思います。
基本編と応用編に分けて書いていく予定です。力尽きなければ。
#文字コードの概要
コンピュータ君はとっても不器用なので、基本的には1か0かしか判別ができません。
それは、コンピュータがトランジスタという「電流を流す(1)か流さない(0)か」しかできないものの組み合わせで構成されているので、仕方ないことなのです。
コンピュータは1か0かしか判別できないので、コンピュータ上で何かを処理するときは二進数というものを使います。
※そのため、メモリやHDD/SSD等のは2のべき乗数単位(8GB,128GB,256GBなど)で構成されることが多いです
そうなると、コンピュータは日本語や英語なんてものは原理的に絶対にわからないのです。だって1か0かしか(以下略)
しかしながら、今日のパソコンやスマホはwebページやアプリ上では日本語の文字を表示できていますよね? コンピュータは1か0かしか(以下略)なのに。
実はそれは文字コードという仕組みを用いて実現しているのです。
##文字コードとは?
文字コードは文字を二進数(1と0の羅列)で表したものです。
ちなみに、文字に限らずに**「ある情報を二進数に変換すること」をエンコード(encode)**と言い、**その逆に二進数の情報を文字などの情報に復元することをデコード(decode)**といいます。
簡単な例になりますが、「a」という文字をエンコードすると・・・
a → 1100001
となります。わけわからん数字😡
通常、二進数は長くなってしまうので以下のように十六進数でさらに省略して表記します。
a → 1100001 → 0x61
上記のようにほぼ全ての文字や記号は二進数(ないしは十六進数)の数字で表現されます。
その結果、『文字』と『文字コード』の対応表が必要になってきます。
この対応表には複数の種類があり、用いる対応表を間違えると文字化けが発生します。
##文字化けの仕組み
先ほど少し触れた通り、文字コードと文字の対応表がずれると意図しない文字が表示される『文字化け』という現象が発生します。
たとえば以下の文字列が文字化けすると・・・
文字化けのテスト
↓
譁?ュ怜喧縺代?繝?せ繝
急にこんな文字列出てくるとドキッとしますよね。急いでいるときはイラッ😡としますね。
これは、「文字化けのテスト」という文字列中の各文字の対応番号が、前者と後者で用いている対応表では全く違う文字を指しているため発生します。
上記の例は、『UTF-8』という対応表でエンコードした文字列を、『Shift-JIS』という異なる対応表でデコードした時の化け方になります。結構このパターンは多いです。
文字コード(十六進数) | UTF-8でのデコード | Shift-JISでのデコード |
---|---|---|
e6 96 87 e5 ad 97 e5 8c 96 e3 81 91 | 文字化け | 譁?ュ怜喧縺 |
めちゃくちゃどうでもいい話ですが、四角(□)に文字化けすパターンは日本で「豆腐」と呼ばれるようになりそれが世界に広がり、「tofu」というワードが世界中でも使われるようになったらしいです。(ほんとかな?)
Googleが提供している 「Noto」というフォントは、豆腐をなくすという意味から「no more tofu」の文字を取ったらしいです。
#文字コードの種類
ということで、ざっくりですが文字コードで代表的なものを挙げていきます。
##JIS
JISという言葉は聞いたことがある方が多いかなと思います。
JISコードはインターネットやEメールで日本語を表記する際に標準的に使用されている文字コードです。
##Shift-JIS
Shift-JIS(シフトジス)はMicrosoft社が日本でコンピュータを普及させる際に策定した文字コードです。
JISからShiftするという意味があるとかないとか。SJISと略したりもします。
外国語を表示するのが苦手とか色々弱点があるそうで、Microsoftも後述するUnicodeにShiftしているみたいです。
##ASCII
ASCIIコードは『American Standard Code for Information Interchange』の略です。いや、長。
歴史も長く、多くの文字コードはASCIIを基にしていたりします。
##Unicode
Unicodeはユニコード・コンソーシアムにより制定され、アルファベットや漢字、アラビア文字など世界中の文字を表現しようという目的のもと作られた文字コードです。
構成によって『UTF-8』とか『UTF-16』とかがあります。
世界中の文字コードを統一しようとしているということもあるので、基本的にはUTF-8あたりでエンコードしておけば大丈夫です。
ただし、JIS / Shift-JISとは互換性がないので(文字コードと文字の対応表がズレている)ので、文字化けを起こします。
😡
※ここで紹介したもの以外にもEUCとかEBCDICとかもあります。
#次回予告
文字化けパターンから、「これはSJISからutf-8に変わったな」的なことを判別する内容を書きます。
あくまで代表的なパターンから推測する方法ですけどね。