UCS-2の奥は深い

一昨日、id:otn:20090324 で、「[Ruby] 文字セットとエンコーディングの混同??」というのを書いたらすぐさま元記事を書いた方id:nurseさんに、解説いただけた。http://d.hatena.ne.jp/nurse/20090325#1237964260 色々とご教示いただきありがとうございます。少なくとも私の書いたのは言われ無き疑いだったことは確かです。


教示いただいた、http://www.unicode.org/glossary/ を見ると、明確に UCSが character set で、UCS-2 UCS-4はencoding form と言う風に書いてある。UCSを2または4 octetで表したものが UCS-2 UCS-4であると。


ただ、UTFの所では、encoding form と encoding scheme が区別して書いてあり、実装というか byte sequence で表現する方法は encoding scheme という扱いだ。そして、バイト列にする前の scalar な値で表現する方法が encoding form。UTF-32だとわかりやすいが、encoding formとしてのUTF-32は、32ビットの値。それをバイト列に変換する方法に、encoding schemeとしてのUTF-32(BOM付き)、UTF-32BE、UTF-32LE がある。UTF-16もほぼ同じ。UTF-8の場合はちょっと違って、encoding formの時点でバイト列なので、encoding schemeでも変わらず。


ところが、UCS-2 UCS-4の所を見ると、encoding form としての意味しか書いてなくて、encoding schemeは無い。つまり、バイト列で表す方法が定められていないということか。ううむ、これではエンコーディングと言っても、ファイルに書いたり、通信に使ったり出来ない。何らかの手段で、バイト列にシリアライズしないと。


ということで、「UCS-2は文字セット」と書いたのは間違いだったけど、ことさらRubyのEncodingに取り入れる必要性があったのかということは引き続き疑問です。



あと、Emacs-Muleについても、私の誤解ですね。Muleだと文字コーディングをちゃんとセットしないと、よくctextになってしまって、他のソフトで読めないファイルになってしまうという経験があるので、compound textを連想したのだけど、そうじゃなくて内部コードを指していると言うことで、理解できました。でも、この形式ってEmacs/Muleからファイルに書けるのでしょうか?出来ないとすると、Rubyで取り扱えてもしょうがない。。。と思ったけど、これも教示いただいた るびま http://jp.rubyist.net/magazine/?0025-Ruby19_m17n を見ると、こういう事のようだ。


ISO-2022-JPのデータがあったとして、そのままでは文字単位で処理できないので、statelessな stateless-ISO-2022-JP にコード変換すると、JISX0208:1978とJISX0208:1983の区別を保ったままで文字単位で処理できる。このstateless-ISO-2022-JPは、Emacs-Muleのサブセットである。」


つまり、ISO-2022-JPのデータを文字単位で扱えるような内部コードが必要であり、そのためにEmacs-Muleの内部コードを借りてきたと言うことですね。内部専用Encodingというか。

こっちも奥が深い。