From: "NARUSE, Yui" Date: 2008-01-30T15:11:28+09:00 Subject: [ruby-dev:33523] Re: nkf の CP932 成瀬です。 Martin Duerst wrote: > CP932 の周りの文字コード変換を検討したところで、 > http://nkf.sourceforge.jp/ucm/cp932.ucm をベースにしたいと思いましたが、 > いくつか気になった点があります。ご意見・アドバイスをお願いします。 > > 1) Private Use Area の使用: > \xF0\x40 |0 # PRIVATE USE AREA > から > \xF9\xFC |0 # PRIVATE USE AREA > までに 7778行目から 9657行目までに 計 1880個あります。 > これは下手するとゴミをばらまくだけなので、止めたいと思っています。 PRIVATE USE AREA の類は総じてゴミだという主張には同意します。けれども、 NTT DoCoMo や Softbank の 携帯電話の SJIS 絵文字がこのエリアに割り当てら れていまして、Unicode へ変換する際にちょうどこのマッピングを用いているの で、この部分がないと困ると思います。 言い換えれば、すでにばらまかれてしまったゴミ(しかも無視できない量)を救 済するために必要です。 > 2) 完全にデータを失う fallback。例えば > \x21 |1 # INVERTED EXCLAMATION MARK とか > \x41 |1 # LATIN CAPITAL LETTER A WITH GRAVE > のように、文字が明らかに違うのに、fallback mapping を > 行っているところは止めたいと思っていますが、どうでしょうか。 > (そもぞもこれは多分 Microsoft のある API のある使い方によって、 > fallback 付きのデータになってしまったと思います。) > (fallback は又別途に色々考えられると思いますが、単なる文字コード変換 > とは別に考えた方がいいと思います。) > 完全には未だ分かりませんが、多分 http://nkf.sourceforge.jp/ucm/SJIS-nkf.ucm > と同じぐらいの |1 のケースがのこるかと思います (主に SJIS 系で事実上全角と > 半角があるのに Unicode にその区別がない少数の記号だけ)。 これもごもっともなのですが、「Microsoft のある API のある使い方によっ て」は具体的には、「ある API」とは WideCharToMultiByte、「使い方」は WC_NO_BEST_FIT_CHARS の有無なのですが、デフォルトが「指定なし」つまり、 デフォルトで fallback を行うのです。 http://msdn2.microsoft.com/en-us/library/ms776420(VS.85).aspx そのような経緯から、この動作を期待しているアプリケーションも存在すると思 うので、残しておいた方がいいのではないかなぁと思います。なにか String#encode に NO_BEST_FIT_CHARS 相当のオプションを与えた場合には fallback を切るというのはアリだと思います。 > 3) 最初のバイトが ED/EE と FA/FB/FC とダブっているものがずいぶん多いが、 > これは http://www.microsoft.com/globaldev/reference/dbcs/932.mspx > にもそのまま載っているので残しておこうかなと思います。例: > \xFC\x47 |0 # CJK UNIFIED IDEOGRAPH > \xEE\xE8 |3 # CJK UNIFIED IDEOGRAPH > 一回 UTF-8 とかに変換すると結果として FA/FB/FC の方が残ります。 > 極めて少数ですが、 > \x87\x82 |0 # NUMERO SIGN > \xFA\x59 |3 # NUMERO SIGN > 見たいに 87 と FA にあるものもあります。この場合に 87 が優先されます。 > [もっとひどいとして、 > \x81\xE6 |0 # BECAUSE > \x87\x9A |3 # BECAUSE > \xFA\x5B |3 # BECAUSE のケースもあります。] http://support.microsoft.com/default.aspx?scid=kb;en-us;Q170559 にもあり ますが、歴史的経緯による仕様なので、これも残してほしいです。 -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA