Top  > 雑記帳  > キーワード別  > 文字コード

文字コードに関する雑記

  2002年01月23日(水)   コードページ
DOSの時代からあるコードーページという概念の位置付けがよくわからなくなってきました。どうもCP932というのはShift JISを表わすようです。W2kのコマンドプロンプトでchcpと打つと「932」と返ってきます。ロケールとコードページの関係もあやふやです。ロケールJAPANのデフォルトのコードページが932ということなのか、ロケールとコードページは切り離して考えるべきなのかよくわかりません。 
 
また、内部ではUnicodeだけれどコードページは932というのもややこしいような気もします。ベースと環境ということでしょうか。 
この932というコードページを見てシステムはShift JISをUnicodeに変換したり、その逆を行なうみたいです。system32フォルダの中にはc_nnnn.nlsというファイルが複数ありますが、これを使ってコード変換をしているのでしょう。 
 
MultiByteToWideChar()やWideCharToMultiByte()の引数にはコードページを指定するところがありますね。 
つまりJIS X 0201とJIS X 0208という文字セットをエンコードしたShift JISとUnicodeのUTF-16(サロゲートなし)の変換ということでしょうか。さらに一部、MS独特のアサインとなる部分もあるそうで、話がややこしくなります。 
 
要は、Shift JISとUnicodeの変換を行なう場合MultiByteToWideChar()などのAPIを使うべきか、外付けの変換ルーチンを使うべきか、という疑問なのですが・・・ 
多分、変換した後のデータを何に使うのか、あるいはどう使うかによってケースバイケースとなるのでしょうね。 
 
【今日の日経平均】 10,040 -10

  2002年01月22日(火)   サロゲート
UTF-16のサロゲートについてもう一度見直してみました。 
まず、BMPのエリアはA領域・I領域・O領域・R領域として次のような範囲に分けられていて、 
 
・A 領域:U+0000〜U+4DFF 
・ I 領域:U+4E00〜U+9FFF 
・O 領域:U+A000〜U+DFFF 
・R 領域:U+E000〜U+FFFF 
 
このうちO領域のU+D800〜U+DFFFまでがサロゲート域として使われているのですね。で、 
 
サロゲートの上位部分:U+D800〜U+DBFF 
サロゲートの下位部分:U+DC00〜U+DFFF 
 
ということで、 
 
プレーン1 (U+010000〜U+01FFFF): 0xD800DC00〜0xD83FDFFF 
プレーン2 (U+020000〜U+02FFFF): 0xD840DC00〜0xD87FDFFF 
 
のように対応するみたいです。つまりサロゲートの部分は4バイトで一文字を表わしています。 
 
ということはUTF-16のテキストがあったとして、その中にサロゲートで表わされる文字が含まれていた場合、プログラム側がその4バイトをU+の3バイトの文字コードに変換して扱わなければいけないということでしょうか。フォント側はU+の文字コードでアクセスされることを想定しているような気がします。このあたりのインターフェースがまだよくわかりませんけれど。 
 
【今日の日経平均】 10,050 -229

  2002年01月21日(月)   JIS
よくISOのなんとか、とかJIS Xのなんとかという表現がありますが、ざっと見ているだけでは訳がわからないので少し調べてみました。 
 
[文字集合体](文字セット) 
 
JIS X 0201 ・・・ 半角カナ含みの1バイト以内で表わせるコード 
JIS X 0208 ・・・ 「JIS 第一水準・第二水準」(6,879文字) 
JIS X 0212 ・・・ 「JIS 補助漢字」(6,067文字) 
JIS X 0213 ・・・ 「JIS 第三水準・第四水準」(4,344文字の追加) 
JIS X 0221 ・・・ UNICODE型(?) 
 
[エンコード] 
 
ISO 8859 ・・・ 8bitコードで、Latin-1はISO 8859-1のこと 
ISO-2022-JP ・・・ エスケープシーケンス有り 
ISO-2022-JP-3 ・・・ ISO-2022-JPのJIS X 0213対応版 
Shift JIS ・・・ エスケープシーケンス無し 
EUC-JP ・・・ エスケープシーケンス有り 
 
あと昔、買ったフグの表紙の「日本語情報処理」(Ken Lunde)という本をひっばり出して読んでみています。さすがに1995年だと記述が古いですが。 
 
【今日の日経平均】 10,280 -13

  2002年01月20日(日)   ウインカリッスの日本語
今更ながら文字コードって中々面倒だな、と思ってnetを見ているとIBMのサイトにICU 2.0(International Components for Unicode)というものがあったのでダウンロードしてみました。オープン・ソースなのですが、ファイル数がたくさんあるので気軽に読むわけにはいかないようです。 
 
「ウインカリッスの日本語」というのは、その中の(多分)文字コードコンバートの作動確認をするためのデータにUTF-8で書かれている言葉です。「ウインカリッス」は人の名前でしょうか? しかし、ファイル名がjap.txtって・・・ 
 
今日は自転車で新宿御苑に行ってみました。というのも先週、神宮外苑に行った帰りに千駄ヶ谷門の前を通った時に、この入口は自転車が置きやすそうだと思ったからです。道路に接している所に車止めがあり、その先のスペースの右側に自転車置き場があります。実際には入園口の外ですが、車止めが道路との区切りになっているので「敷地内」という感じがします。 
 
まだ冬の景色ですが、梅のつぼみはついていました。本日の走行距離は23kmでした。

  2002年01月16日(水)   Unicode
UnicodeについてはWin98あたりから採用になった2バイト文字コードという程度の認識しかなかったのですが、PCREのドキュメントの中でUTF-8というのが出てきたので少し調べてみました。今さらですが、どうもややこしいもののようですね。特にサロゲート(surrogate)のあたりが「ズル」っぽいです。そもそもjapaneseセットという「ひとくくり」がないのが非常にわかりづらく思えます。 
 
つまり、こんな感じでしょうか。 
------------------------------------------------------ 
Unicodeは1+16(=17)個のプレーンを持つ。 
一つのブレーンは0x0000〜0xFFFFで表わされる256*256(=65,536)個のコード領域を持つので、全体では256*256*17個のコード領域となる。 
 
はじめのプレーンの0xFF * 0xF7、つまり256個*248個(=63,488個)の部分をBMP(Basic Multilingual Plane)あるいはプレーン00と呼ぶ。(すでにこの辺りからして言葉の使い方があやしい) 
 
はじめのプレーンの残りの部分の0xFF * 0x08、つまり256個*8個(=2,048個)の部分はサロゲート(surrogate)と呼ばれる。 
 
よって、はじめのプレーンはBMP部分とサロゲート部分から構成される。  
 
このサロゲートの部分は、そのままコード領域として使うと2,048個にしかならないが、上位1,024個と下位1,024個に分けてアドレスを指すと考えるると、1024*1024(=1,048,576)種類の場所をポイントできる。 
----------------------------------------------------- 
すでにUnicode 3.1でプレーンを超えた領域に文字がアサインされていますが、このサロゲートの考え方は、UTF-16の時しか関係ないような気もします。 
 
確かC++ Builderではwchar_tがunsigned shortだったような気がするので、その世界でのワイルド文字(Unicode)という言葉が指しているのは、UTF-16か、サロゲートなしのUTF-16(UCS-2?)のことなのでしょうか。このあたりはまだよくわかりません。 
 
【今日の日経平均】 10,177 -30