From: "NARUSE, Yui" Date: 2007-09-28T22:13:54+09:00 Subject: [ruby-dev:31897] Re: [m17n] String#encode 成瀬です。 Martin Duerst wrote: >> Shift_JIS を >> CP932 に差し替えるとか、 > > その二つの違いは具体的に何でしょうか。ただ後者で MS 特有の > 外字が追加されたらバイト列→文字コード着きバイト列と同等なのは > すごく納得します。 > > しかし、iconv (一部?) みたいに、Shift_JIS の 0x5c を円記号、 > CP932 の場合にはバックスラッシュ、という場合にはちょっと > 違うのではないかと思います。 「文字コード」という概念は多義的なもので、主に 1.valid なバイト列の定義  (/[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]/とか) 2.コードポイントへの文字の割り当ての有無 3.Unicode との変換表 4.文字列(コードポイント列・バイト列)の意味 といったものがあると思います。 で、Shift_JIS と CP932 の違いは 2, 3, 4 なのですが、 実際に問題となってくるのは 3 でしょう。 これには、一部ベンダーの独自文字をマップするか否かもあるのですが、 円記号問題のように変換表ごとにマップが異なってる場合もあります。 なお、これはShift_JIS 等と Unicode の間の変換のみならず、 "\u00A5"をいかにバイト列に変換するか等にも絡んできます。 http://www.w3.org/Submission/2005/SUBM-japanese-xml-20050324/ > 個人的には三種類のものがあるかと思います。 > 1) 解釈してないものを解釈する。これは場いつ列に文字コードを教える、 > (上記の条件で) Shift_JIS から CP932 とかが考えられている。 > これは 「interpret_as」とか 「as」みたいな名前がいいのではない > かと思います。多分ここは逆のケースも入るのではないかと思います。 > (String#interpret_as('UNKNOWN-8BIT') とか; "UNKNOWN-8BIT" については > http://www.iana.org/assignments/character-sets 参照) > 2) 文字コードを無理矢理変えること。これは普通は余り使わない方がいいので、 > 長い名前がいいのではないかと思います。例えば「force_encoding」とか > のようなもの。 > ここまでの問題は、相当の情報がないとなかなか 1) と 2) をよく区別でき ない。 > > 3) 文字コード情報をベースにコード変換を行う。これは多分 > String#convert と String#convert! ぐらいでいいだろうと思います。 他の言語ならばそのように3つのメソッドに分けると思うのですが、 Ruby は似た機能は一つのメソッド/クラスにまとめるという傾向があるので、 String#encode に現在まとめてあるのだと思っています。 けれども、変換していないのに変換を意味する語を用いているのはアレなので 1) 2) を別にしようという話なのですよね。 -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA