文字コードの作られ方を背景も含めてコンパクトにまとめてみました。
他のサイトを見ると規格の名前とかがいっぱい出てきてよくわかりません。
またコンパクトではありません。この辺は色々面白いことがあって一杯書いてあるのだけど...。
更にどうしてそう考えたのかという基本的な設計思想について書いたサイトがありません。
書いてあっても分量が多いので読むのに疲れてしまいます。
どうしてそう考えたのかは私が勝手に想像した事も含めて記述します。
詳しいことが知りたければ、他のサイトを参照してください。
以下はバイト、ビット、16進数字等、基本的なコンピュータ用語がわかっている人を対象とします。
「?」は任意の16進数字に置き換えてください。
- EBCDIC(K)
- 汎用機という大型計算機で使用された文字コード。
- 汎用機以外では使われない。
- EBCDIK(Kは with Kana)には半角カナ文字もあった。
- この時から半角カナ文字を日本人は手放せなくなった。
- 未だに半角カナ文字を表示/入力するシステム(例えば銀行)がある。
通帳の振込相手先が未だに半角カナで印刷される。
- そもそも汎用機ってまだ銀行にあるみたいだね(ネットで検索した結果)。
- COMP-3 と言う桁落ちのない10進数の計算ハードウエアがあるからなのか?
- ASCII
- パソコンで使われているコード。
- 数字(0x30-0x39)、アルファベット大文字(0x41-0x5a)・小文字(0x61-0x7a)、
制御文字(0x00-0x1f,0x7f)、記号(0x00-0x7fのこれら以外)。
- 漢字等(漢字、ひらがな、カタカナ等)はこの時点でなし。
- 通信プロトコルではメールヘッダー、通信コマンド等に使われる基本コード。
- 1バイト/1文字。
- 他の先頭ビットが立っているバイト(0x80-0xff)に様々な拡張がされていく。
半角カナ文字(0xa1-0xdf)もその例。
- JIS
- ASCIIとは無関係に漢字等を2バイトで定義した。通信に使うため制御文字との被りは避けた。
- ASCIIと漢字等のつなぎに、シフトイン(以降は漢字等)、シフトアウト(以降はASCII)という
文字列がどうしても必要になる。
- シフトイン/アウトが化けると以降が全て化けるため、本来通信に向かないコードになってしまった。
- 日本語メールの場合は絶対的標準コードだった(今はUTF−8が多少混ざってきた)。
- EUC
- ASCIIを残し、残りの0xa1-0xfcをリード(lead)バイトとして
次の1バイトと組み合わせて漢字等を表現。
- 半角カナ文字は別に0x8e??として2バイトコードにした。
- Unix等の基本コード。
- Shift−JIS
- ASCIIと半角カナ文字を残し、残りの0x8?、0x9?、0xe?をリードバイトとして
次の1バイトと組み合わせて漢字等を表現。
- 日本の Windows パソコンの基本コード。最近はUTF−16も意識するようになってきたが...。
- 2文字目も制御文字と被るのはいやなので0x40-0xfc(0x7fを除く)の範囲にしている。
- 2バイト文字はざっと計算して3×16×188=9,024文字が表現できる。
常用漢字に加えて人名用漢字、ひらがな、カタカナ等を加えても表現するには充分。
- UTF−16
- 世界各国の文字全てを2バイトで表現しようとしたコード(既にこの構想は崩壊)。
- 基本2バイト/1文字、65,536文字を表現。サロゲートペア(ネットで調べて)を考えると1,112,064文字を表現。
- プログラミングではバイト数固定の方が簡単。そのため世界中の Windows パソコンの内部基本コードになっている。
実は Windows 95 の頃から各国語版を統一して作るためにそうなっていた。
- 通信のことは全然考えていないので、制御文字が入ってくる。よって通信の世界では使えない。
- ASCIIは0x00??になる。
- 半角カナ文字にも無事にコードが割り当てられた0xff61-0xff9f。めでたしめでたし。
- Unicode
- 世界各国の文字全てを16ビットで表現しようとしたが失敗したので21ビットにしたもの。
- 文字コードというよりは世界中で決めた規格である。
- 「U+16進数字」で表現、コードポイントという。U+10FFFF まである。
- 1,114,112 文字、サロゲートペアの文字数とほぼ一緒。違いはサロゲートペアの代用符号位置分。
- 2バイトで表現できない文字をサロゲートペアで表現したものを UTF−16、コードポイントで表現したものを Unicode といえる。
- そのため UTF−16 と Unicode を混同して使っている場合が多い。
そもそも Unicode Ver.3.0.1 までは同じだった。
- ちなみにコードポイントをそのまま4バイトの文字コードにしたのが、UTF−32。
- 文字を表現できる数が膨大になったので、悪乗りして携帯電話の絵文字や古代文字、甲骨文字、
トランプカードや麻雀パイ(これらって文字?)まで割り当てた。
- 最近では「令和」を1文字にした文字「㋿」まで登録した。
- Ver.12.1.0 の段階で登録文字は137,929文字、Unicode の文字数の12.4%。
- UTF−16、UTF−8、UTF−32 も合わせて、Unicode という場合がある。
- UTF−8
- UnicodeのASCII部分を1バイトにできないかと機械的な変換手順(ネットで調べて)を考えて作ったコード。
その結果通信でも使えるようになる。
- 1〜6バイト/1文字、とりあえず4文字までを説明。
- 1バイト文字、U+0000 - U+007F、0x00-0x7f、128文字を表現、ASCIIと同じ。
- 2バイト文字、U+0080 - U+07FF、0xc0-0xdf・0x80-0xbf、1,920文字を表現、様々なアルファベット等。
- 3バイト文字、U+0800 - U+FFFF、0xe0-0xef・0x80-0xbf・0x80-0xbf、63,488文字を表現、漢字等はここに含まれる。
- 4バイト文字、U+10000 - U+10FFFF、0xf0-0xf4・0x80-0xbf・0x80-0xbf・0x80-0xbf、1,048,576文字を表現。
- 先頭バイトにより何バイト文字かを判定できる。2進数で考えると、
先頭ビット0:1バイト文字、先頭ビット110:2バイト文字、先頭ビット1110:3バイト文字
先頭ビット11110:4バイト文字...になっている。
なお先頭ビット10は2バイト目以降の文字として定義されている。
- 4バイト文字の1バイト目は本来 0xf0-0xf7 だが上記で十分。またわかりやすさのため上記の 0x??-0x?? は少し大きい。
- よって2バイト目以降もASCIIとは重ならないので通信を邪魔しない。
通信で文字化けしても、影響範囲はその文字のみ。
- また、文字列を後ろから検索しても、先頭バイトがわかるというメリットもある。
- 文字表現数が十分なので、5、6バイトは不正文字にしている場合もある。また3バイト目までしか処理されない場合もある。
- 理論上は7バイト文字も定義できるが、7バイト文字を定義するとBOM(ネットで調べて)と重なる場合があるので定義しない。
戻る