永井@知能.九工大です.

From: Tanaka Akira <akr / fsij.org>
Subject: [ruby-dev:33047] Re: Binary String
Date: Sat, 12 Jan 2008 01:26:46 +0900
Message-ID: <87tzlkz5tl.fsf / fsij.org>
> 
> > 現状では
> > ------------------------------------------------------------------------
> > $ echo $LANG
> > ja_JP.eucJP
> > $ ruby19 -v 
> > ruby 1.9.0 (2008-01-10 revision 0) [i686-linux]
> > $ ruby19 -e 'a = "aaa"; e = "漢字"; p [a.encoding, e.encoding, Encoding.default_external]'
> > [#<Encoding:ASCII-8BIT>, #<Encoding:ASCII-8BIT>, #<Encoding:EUC-JP>]
> > ------------------------------------------------------------------------
> > ということになりますが,これは現状が間違っているということでしょうか?
> 
> 最初の a は ASCII しか含まれていないので ASCII-8BIT となって
> いても、変換せずに送ってもなんの問題もないと思います。
> 
> 次の e は Ruby スクリプトの文字コードは locale に依存せず、
> magic comment で記述するという規則だからです。これはスクリプ
> ト自体が locale に関係なく動くことが期待されているのが理由で
> す。スクリプトに非 ASCII 文字を使うときは magic comment を書
> いてください。
> 
> ここで永井さんの変換の問題は e だと思いますが、スクリプトを
> locale 依存にしたいということですか?

デフォルトではそれもありという気はしますが,
そういう話ではありません.
「ASCII-8BIT が付いている方が悪い」という話に対し,
「現状は未定義だと 勝手に ASCII-8BIT が付けられちゃいますよね」
という話です.

「未定義」はデフォルトを参考にしてである程度は救済できますから,
できる限り救済してあげたいと思ってます.
で,「未定義」が明確にできないのであるなら,
逆にせめて「変換禁止と定義済」を明確に宣言できるものが
欲しいという希望です.

> スクリプトに非 ASCII 文字を書くなら magic comment を書くとい
> うのは受け入れられませんか?
> 
> tk だけでなく、例えば rdoc でも Ruby スクリプトを処理すると
> きに非 ASCII 文字が入っているなら magic comment を書いておい
> てもらわないと処理に困るのですが。

う〜む.
自分自身でも何が何だか分からなくなってきたので,
質問を一旦整理してみます.

まず最初に,

 * encoding が未定義ならば,デフォルトを使って救済してあげたいと
   考えるのは「悪」か?

Ruby 1.8 の Ruby/Tk では救済を図る方針でやってました.
しかし Ruby 1.9 では,救済を考えること自体が「悪」であり
「小さな親切,大きなお世話」であるというのであれば,
どうしようもありません.

それとも,

 * そもそも「encoding 未定義」が発生すること自体が「悪」

でしょうか.
もしそうであるなら,encoding 無指定の場合は
default_external が指定されるべきであり,
かつ,default_external には決して ASCII-8BIT が設定されない
とすべきように思えます.
現状はともあれ,今後は encoding 未定義で ASCII-8BIT が
設定されることは一切ないということであれば,
ASCII-8BIT を binary として用いることにも問題はなくなります.

以降は「encoding 未定義が発生する可能性はある」,
「encoding 未定義を救済しようとすることは悪ではない」
という前提で進めます.

 * 現状では encoding 未定義と binary とが同じ ASCII-8BIT で
   区別できないという認識は正しいか?

 * 未定義と定義済とは区別できるべきではないのか?

 * 区別できるようにするなら,「未定義と定義済」とするのか,
   それとも「(未定義or定義済)と定義済」とするのか?

「binary の導入を」という希望は,
未定義と定義済との区別がなされていないように見える現状に対し,
せめて「(未定義or定義済)と定義済」の区別ができるようにしてほしい
というものです.
ですので,例えば未定義 == dummy encoding であり,
それによって「未定義と定義済」の区別ができるのであれば
binary == ASCII-8BIT でも何ら不満はありません.
-- 
                                       永井 秀利 (九工大 知能情報)
                                           nagai / ai.kyutech.ac.jp