2006年05月10日 11:00 [Edit]

Encode - 規格のバグまでは直せません

それが規格だからです。

b:note: Encodeのナゾ
最近会う機会が無いので、トラックバックします。
    $moji = "~";
    Encode::from_to($moji, "euc-jp", "utf8");
    print $moji;
で出てきた文字をWindowsのメモ帳とか秀丸でみると、~の波形が反対になった文字になってしまいます。

ここでいう「~」はU+FF5E、Fullwidth Tildeのことです。


その答えは、「Unicode Consortiumが用意したJISX0212とUnicodeの変換表がそうだったから」ということになります。Encodeのせいではないのです。詳しくは、

Japanese <-> Unicode Mapping Rules
http://www.asahi-net.or.jp/~hc3j-tkg/unicode/
Unicode とユーザ定義文字・ベンダ定義文字に関する問題点と解決策
http://www.opengroup.or.jp/jvc/cde/ucs-conv.html

あたりをご覧下さるとして、一番簡単な結論は、WindowsではEncode::EUCJPMSを使いましょう、ということになるでしょう。

はてなるせだいあり - Encode::EUCJPMS 0.05 Released http://search.cpan.org/dist/Encode-EUCJPMS/

この問題に関しての「権威」である森山さんのblogも必読かな。

eucJP-ms と CP51932 の違い コードページ932/ウェブリブログ
eucJP-ms と cp51932 は、両方とも、EUC-JP をWindows標準キャラクタセットの文字を扱えるようにしたもので、それぞれ次のような拡張が行われています。

それにつけても、この手の規格バグはほんなるせない、じゃなかった、やるせない気持ちにさせられます。尻拭いをするのは規格を制定した方じゃなくて実装側。それでもまだ森山さんのプロジェクトの方は政府の支援が出てますが、私にビタ一文こないのはなぜだろう:p

Dan the UNPAID Maintainer of Encode


この記事へのトラックバックURL

この記事へのトラックバック
これを見てちゃぶ台をひっくり返したくなった。 革命の日々! レガシーエンコーディングなオフ会 今日、ミラクルリナックスの吉岡さん主催の 「文字コードヲタクで集まってピザとビールを楽しむ会」に参加してきた。 (うそ、本当はレガシーエンコーディング変換機能の...
(en)?cod(e|ing)の話をするならcodeしてる奴を呼ばんか!?【404 Blog Not Found】at 2006年05月18日 11:57
えー、どうも詳しい人同士で議論して初心者置いてきぼりモードに突入しているようなので、ここでおせっかいにも初心者向け解説を入れてみる b:note: Encodeのナゾ 最近会う機会が無い??.| р
それは典型的な波ダッシュ問題ではあるまいか【革命の日々!】at 2006年05月10日 18:36
この記事へのコメント
「Unicodeとユーザ定義文字…」の文書については、次のURLで参照可能にしました。

http://home.m05.itscom.net/numa/cde/ucs-conv/ucs-conv.html
Posted by numa2666 at 2007年06月12日 15:42
こんにちは。

オープングループのWebサイトが閉鎖状態のようです。このエントリを最初に読んだときはリンクがまだ生きていましたが、いまはほとんどのページが「Not Found」になってしまいますね。このドキュメント(↓)は有用だったのですが・・・。

Unicode とユーザ定義文字・ベンダ定義文字に関する問題点と解決策
http://www.opengroup.or.jp/jvc/cde/ucs-conv.html

Posted by raven at 2006年12月26日 13:46
ブログの価値を計算させてもらいました。
デザイン、質感、スタイルが価値のあるブログ
として、当社としては一度お話をしてみたいと
思いました。よければ一緒にブログを盛り上げて
みませんか?あなたが所有者で、当社が運営者
です。当社概要をご覧ください。
http://kg843hgssdf.info
Posted by あなたのブログの価値 at 2006年05月17日 19:50
ブログの価値を計算させてもらいました。
デザイン、質感、スタイルが価値のあるブログ
として、当社としては一度お話をしてみたいと
思いました。よければ一緒にブログを盛り上げて
みませんか?あなたが所有者で、当社が運営者
です。当社概要をご覧ください。
http://kg843hgssdf.info
Posted by あなたのブログの価値 at 2006年05月17日 16:04
親愛なるboguspokesmanのために、あかね姫のcommentは消さずにとっておきます。ただしlinkのみ編集しときました。

Dan the Man Behind this Blog
Posted by at 2006年05月11日 12:07
boguspokesman さんがおいし過ぎて手も足もでない件についてw
Posted by kosaki at 2006年05月11日 09:17
あかねたんは波ダッシュのことどう思うの?
ぼくはあかねたんの王子さまになりたい。
Posted by boguspokesman at 2006年05月11日 06:22
それは言いだしっぺの法則により、吉岡さんが書くことが確定ですね。φ(.. )メモメモ

あと、ひとつ誤解があると思うのですが、元々の質問者の話はJIS X 208 WAVE DASHを変換しようとしており、手元のCentOS4(perl 5.8.5、だれかEncode単体のバージョンの調べ方教えて)ではU+301C(WAVE DASH)に変換されましたよ。
だからこそ、Windowsでは波が逆向きに見える結果になるわけで・・
Posted by kosaki at 2006年05月10日 23:16
http://slashdot.jp/~yasuoka/journal/357074 安岡さんの日記を読むと、「JIS X 0208の1区33点「波ダッシュ」をUnicodeに変換する際、U+FF5EのFULLWIDTH TILDEに変換するのは明らかに間違いだ。」とのことなのだけど、MSの実装がそうだからそういう実装にした、とか弾さんは言わないのかなあ?(言うわけないですね、失礼しました)
この文字コードの問題は普通の人にはほとんど理解不可能で、分かりやすい解説書が絶対必要ですよね。
Posted by hyoshiok at 2006年05月10日 23:00
あかねは姫に変身♪
Posted by あかねの姫ブログ at 2006年05月10日 20:23
弾さん、
権威だなんて。

それはともかく、JIS漢字と Unicode(UCS) の変換表に関しては、JIS X 0208:1997 の公開レビューの時に、電子ファイルで提供して欲しい旨の要望を出した記憶があります。

ちなみに、Unicode コンソーシアムの JIS0208.TXT、JIS0212.TXT は、JIS X 0201 ラテン文字と組み合わせることを前提としたマッピングになっているので、Encode のように 0x00〜0x7F は US-ASCII とする場合は、そのまま使うと問題が生じますね。

従来の文字コードとUnicodeの対応に関する諸問題 > 6. ASCIIとJIS X 0201ローマ文字
http://euc.jp/i18n/ucsnote.ja.html#ascii
が参考になります。
Posted by 森山 将之 at 2006年05月10日 16:57
えむけいさん、それを言い出すと、そもそもJIS X 0221-1:2000の『附属書2』は「参考」ですから、JIS X 0212の2区23点とU+007Eを対応させる根拠も、規格の規定上やはり明確ではないんですよ。でも、それじゃさすがにまずいので、「参考」ながらも『附属書2』があるし、『解説』p.1107の「3.8.6b」やp.1112の「例1」「例2」で、クダクダとFULLWIDTH TILDEのことを書いているわけです。うーん、やっぱり、JIS X 0212の改正しかないかなぁ…。
Posted by 安岡孝一 at 2006年05月10日 15:39
規格の本体には書いていますか?
とりあえずJIS X 0221-1:2001の附属書2表1には
2-23 チルド 007E TILDE
と書かれていますし、
附属書2の1. b) 1)を見る限りでは「片方向変換」にするのがむしろ正しい対応であるようにも思えます。
1. a) 1)に「代替の名前について」書かれてはいますが、JIS X 0212のTILDEの代替としてFULLWIDTH TILDEを用いることができるという根拠が(規格本体からは)明確ではありません。
Posted by えむけい at 2006年05月10日 15:19
えっと「JIS02??.TXTにfullwidth tildeはありません」ってのは、おっしゃる通りなんですが、JIS X 0221-1995の解説4.5.3.4 (p.1001)やJIS X 0221-1:2000の解説3.8.6のb (p.1107)にも書いてあるとおり、ISO/IEC 646 IRV(つまりASCII)とJIS X 0212を同時に使うエンコーディングにおいては、JIS X 0212の2区23点をU+FF5E(FULLWIDTH TILDE)に対応させるのが正解です。ですから正直なところ、「片方向変換」ってのは、まずいんじゃないかと。
Posted by 安岡孝一 at 2006年05月10日 13:34
安岡さん、
ちょっと舌足らずでした。
Encodeのeuc-jpの実装は、
http://www.unicode.org/Public/MAPPINGS/OBSOLETE/EASTASIA/JIS/JIS0212.TXT
が元になっていて、0x2237(2区23点)はeuc-jp -> utf8のみの片方向変換として
実装しています(理由は上のとおり)。そしてJIS02??.TXTにfullwidth tildeはありません。
なお、このファイルPerl 5.8開発の時にはOBSOLETE directoryにはなく、このファイルに代わるものが見当たらないのは、今もって開発者の悩みの種でもあります。

Dan the Encode Maintainer
Posted by at 2006年05月10日 12:18
『JIS X 0212 (1990) to Unicode』(8 March 1994)をチェックしてみたのですが、JIS X 0212の0x2237(2区23点)は、ちゃんとUnicodeのU+007E(TILDE)になってますよ。「Unicode Consortiumが用意したJISX0212とUnicodeの変換表がそうだったから」っていうのは、本当ですか?
Posted by 安岡孝一 at 2006年05月10日 11:49