From: Hidetoshi NAGAI Date: 2007-12-12T14:56:29+09:00 Subject: [ruby-dev:32550] Binary String 永井@知能.九工大です. encoding についての話です.間違っていれば訂正ください. binary string を明示できるような encoding を 追加してはいただけないでしょうか? # Tcl/Tk の encoding names では 'identity' となるもの. Ruby/Tk では,ruby から tk に文字列を送る際, システムの encoding 情報に基づき,utf-8 に自動変換して送っています. もちろん「変換明示が不要」というユーザの利便性を考えてのことです. Ruby 1.8 では $KCODE と Tk の encoding system とを用いていました. 現状の Ruby 1.9 を見ると,encoding 未指定の場合の encoding は ASCII-8BIT とされるように思えます. 自動変換は Encoding.default_external を参照することになるでしょう. つまり,ASCII-8BIT である場合は, 実際には Encoding.default_external の encoding であると仮定して utf-8 への自動変換をかけるわけです. 一般的な状況ではこれで問題ないのですが, binary data を扱う場合に困ります. binary data には自動変換をかけてはならないわけですが, binary data であることを明確に区別できる情報を オブジェクトが持っていなければ変換すべきか否かを判断できません. 判断できないということは自動変換のすべてを諦めねばならず, 「明示不要」という利便性をユーザが失うことになります. UNKNOWN-8BIT が導入されても状況は変りません. ASCII-8BIT は ASCII-8BIT -> UTF-8 の自動変換を行うし, UNKNOWN-8BIT は Encoding.default_external を参照に変換するでしょう. ですので,UNKNOWN-8BIT を binary data 用にすることはできません. Ruby 1.8 の Ruby/Tk で行ったように, 特別な文字列クラスを使って条件分けで対応をすることは可能ですが, せっかく文字列に encoding 情報を持たせているのに 統一的な処理ができないのは嬉しくありません. さらに,逆方向の問題もあります. tk から ruby に binary data を返すときにどうすべきかです. ASCII-8BIT や UNKNOWN-8BIT にしてしまうと, 再度 tk に送る際などに面倒になります. 他の encoding への変換ができない 'IDENTITY' というような encoding が存在すれば,問題発生を回避することができます. 多分,性格としては, * 他への encode が要求された場合は, 例外を上げずにそのまま ('IDENTITY' のまま) を返す. * 他の文字列との連結の際には, 相手も 'IDENTITY' の場合はそのまま連結するが, そうでない場合は例外を発生する. というものになるのではないかという気がします. # Array#pack の出力なども 'IDENTITY' とすべき? 「そんな心配しなくても,こうすればいいよ」という方法がありましたら ぜひお教えください. そうした方法がなければ,binary data 用の encoding の導入を 検討いただけると助かります. -- 永井 秀利 (九工大 知能情報) nagai@ai.kyutech.ac.jp