仕事で文字コード変換について勉強する機会があったので、書いておきます。
文字コードについてはたくさん良記事があるので、新たに何か書くこともないのですが、
自分の知識の整理という意味合いで書きます。
既存だと、特にこの記事がいいと思います。
新人さんに知ってほしい「文字コードのお話」
UnicodeとUTF-8の違いが正確に説明できる人であれば、この記事を読む必要はないです。
文字コードとは
JISとかUnicodeとかを漠然と文字コードと呼びがちですが、
実際のところ、文字コードというのは結構意味が広い用語なので、
厳密な話をしたいときは注意が必要です。
Wikipediaによると
コンピュータ上で文字(キャラクタ (コンピュータ))を利用する目的で各文字に割り当てられるバイト表現
ということらしいです。
文字コードというのは、文脈によって意味が異なっていますが、基本的には下記の二要素を指しています。
文字集合 + 符号化方式
長い呼び方をすると、符号化文字集合と文字符号化方式なのですが、
ちょっと漢字が並びすぎていてイカついので、本記事では短い方を使います。
文字集合とは
文字に対して、1対1でバイト列を割り振った集合のことです。
たとえばJISだと、文字の「1」は0x31、「A」は0x41、です。
いくつか代表的なものを見ていきましょう。
ASCII
1962年にアメリカで標準化された文字集合。
たった7ビットで、制御文字・数字・文字・記号が扱えます。
0x00〜0x1Fが制御文字になっています。
ASCIIで新たにシステム作るってことはないでしょうが、だいたいの文字集合のベースがASCIIなので、
文字コードについて調べると必ずASCIIから始めることになると思います。
JIS
ASCIIだと日本語文字が表せない問題があった。
日本語向けの標準化が行われたのがJIS。
基本的な発想としては、ASCIIで使われていない箇所にカナ文字や句読点を割り振ってしまおうということで規格が作られています。
ただ一部記号でASCIIと異なっており、有名なところでいうと、ASCIIにおける/が¥になっています(0x5C)。
Unicode
ASCIIだのJISだの各国の標準規格だと、結局国を超えた通信ができませんね。
そこで、
「世界のすべての文字を対象とした文字集合作ってやればよくね?」
という発想のもと、Unicodeが標準化されました。
英語だとアルファベット26文字しかないですが、日本語だとひらがな50文字、カタカナ50文字、漢字もいれると……何文字なんだ……
漢字圏を入れただけでも文字数が大変なことになりますが、詳細は下記のWikipediaでも見てください。
世界中にたくさんある文字でも、2Byteあれば表現できると思って1980年代に標準化されましたが、
余裕で足らなかったので、現在は4Byte文字になっています。
符号化方式
文字集合をコンピュータが利用できるデータに変換する方法のことです。
エンコードと呼ぶことの方が多い気がしますが、エンコードもまたもう少し広い用語です。
文字集合=符号化方式では?
文字集合と符号化方式を別々に考えるのはなぜでしょう?
文字をあるバイト文字で表している文字集合があるのだから、
符号化方式も、その対応表に従って、1:1で扱うだけなのでは? という疑問が浮かびました。
この疑問はたぶん「交通ルールをつくれば皆安全運転するだろう」レベルの疑問で、
実際は交通ルールはこうだが、実際に道路出てみると法律にはないルールが結構あるみたいな話なんだと僕の中では思っています。
文字集合が1:1対応だとしても、それを実装する方法は複数考えられます。
文字集合の規格を考える人々は、ANSIやJISなどの標準化団体であって、実装まで考えてくれません。
実装するのはIT技術者サイドなので、そこで問題が発生すると、特殊な符号化方式を考えたりするわけです。
なので、原理主義的に考えれば、文字集合と符号化方式をわけて考える必要はないのですが、
現実的には文字集合と符号化方式の間には乖離があり、
どの文字集合を扱っているかだけでなく、どの符号化方式で処理しようとしているかまで考えて設計すべきです。
符号化方式の例
有名どころだとShift-JISとか、UTF-8とか、UTF-16とかです。
(投げやり)