覚書。
文字コード
プログラミングで用いる文字コード。日本国内ではUTF-8が強い。
単純な書類ではSHIFT_JISが一般。ただし、UTF-8もデフォルトで読めることが多いので、問題ない。
Unicodeは文字セットである。文字コードではない。
UTF-8は文字コードである。文字セットではない。
しかし、textpadでもsakuraでも、文字コードセットの項にUTF-8とUnicodeが共存している。
実に紛らわしいことだが、これらは、UnicodeをUTF-16の意味で用いているものだ。
文字セットというのは、そのまま、文字の集合体のことである。
文字コードというのは、エンコーディング方式のことである。
フォントというのは、採用している文字セットに対して、文字の見た目を提供するものである。
Unicodeは世界中の文字を表現するための規格だ。
空き領域の存在を考慮しても、すさまじい文字数である。
要するにUnicodeとは何なのか、というと、単なる「文字表」である。
文字を表形式で並べたものにすぎない。(実際には辞書型で定義されている)
(ちなみに、Unicodeの辞書リストに用いるキーのことをコードポイントという。)
だから、ハングル文字の領域がバージョンアップの時に民族大移動をしたりする。
しかし、これは飽くまで表である。
こんな文字のことを言うんだよ、と宣言している表にすぎない。
単なる表である以上、パソコンで扱うことはできない。パソコンは機械語しか読めないのだから。
そのために、Unicodeを符号化(パソコンで扱える状態にする)してやらなければいけない。
その符号化方式を示したのが文字コード。
ユーザーはメモ帳でぽちぽちと文字を打つ。これを保存するとき、特定の文字コードで保存される。
このファイルを他のパソコンへ持っていき、展開する。
この際、文字コードを読み取り、対応するUnicodeを表示するわけだ。
ちなみに、UTF-8の、UTFというのはUnicode Transformation Formatの略。
(UTF-8はUniversal multi-octet Character Set、通称UCSという名の文字セットでも使える。)
(なんで互換性があるのかまでは知らないが、現状、UTFはUnicodeTFまたはUcsTFの略称である。)
しかし、実際にはUnicodeがそのまま表示されるわけではない。
というのは、Unicodeは文字の定義を決めるだけで、見た目は決定しないからだ。
実際に表示されるのは、Unicode対応のフォント、ということになる。
順を追ってみてみよう。
あるテキストファイルがあったとして、これを表示するまでに何が起きているか。
1.ファイルデータを読み込む。
2.データの文字コードを識別する。
3.その文字コードに従って、データをUnicodeに戻す。
4.Unicodeの文字列データを作る。これは内部で処理され、体感することはできない。
5.テキストリーダー(textpad等)の設定から、フォントを識別する。
6.そのフォントに従って、Unicode文字列を順に画面上へと表示する。
どうせなら、メディアとなっているUnicodeを挟まずにUTF-8からいきなり変換できればいいのだが。
そうしないのには何か理由があるのかもしれない。
現状分かっていることは、Unicodeを挟むことで、
どの文字コードからでも、全てのフォントを利用できる、ということだ。(Unicode対応のみ)
長々と書いてあるが、もう一点押さえなければならない。らしい。
正規化表現、とか呼ばれるもの。
生物選択な人向けに話すので我慢して聞いて欲しい。
遺伝子からポリペプチドを形成するとき、塩基3つ組でアミノ酸を指定していたはずだ。
その対応表をさして、コドン表、という。しかしコドン表は、重複があっただろう。
塩基は4種類だから、3つ組で4の3乗=64ぱたーん。
対して、アミノ酸は20種。終止コドンを含めても21種にしかならない。
すなわち、平均して、1種につき3パターンの表し方が存在することになる。
こういった事情をUnicodeもはらんでいる。
一つの文字に対して、複数のキー(コードポイント)が割り当てられている。
しかも、コードポイント2つで一文字を表現するような変り種が沢山存在する。
なんでこうなってるのかは知らないが、とにかく、このままでは文字コードを解釈できない。
そこで、私は正規表現(1対1対応に新しく規格された表現法)を用います、と宣言する必要がある。
で、この正規表現、数種類あるらしい。ますます面倒な話だ。
なんだけども、あんまり意識しなくても正直、問題は普通起こらないとか。
いったいどういうことなんだろう。ごめん、そこまでは分からないや。
まとめ。
Unicodeは文字セットである。
UTF-8は文字コードである。
フォントは見た目を決定するものである。
正規表現を宣言しなければいけないらしい。けれど、それでエラーになったという話は少ない。
特定の関数(MultibyteToWideChar()など)でのみ考慮するべき事象のようだ。
結局、何を使うべきなのか?
おすすめの文字セットはUnicodeである。全世界対応は魅力的だ。
当然、文字コードはUTF-8,UTF-16,UTF-32あたりに限定される。
この3つの文字コードには特徴がある。
UTF-8……英数を扱う時、1バイトで扱える。しかし、日本語は3バイトになる。
UTF-16……英数も日本語も、2バイトで扱う。4バイト文字(UTF-8に含まれない)も扱える。
UTF-32……全てのUnicodeを同じバイト数で扱う。必然、データ量は巨大になる。
結論。
半角英数が多いならばUTF-8を使うべきで、
日本語とかの全角文字が多いならばUTF-16を使うべきである。
ただし、日本国内はデフォルトがSHIFT_JISであることが多い。
よって、他人に日本語パート(シナリオなど)を書いてもらう場合はSHIFT_JISを使おう。
UTF-16を用いているならば、その旨を相手に伝える責務がある。
普通にプログラムを組むときはUTF-8を使えばよさそうである。
[0回]
PR