[ruby-list:45465] Re: Ruby 1.9における異なるエンコーディングの文字列の結合

From: Yukihiro Matsumoto <matz@...>
Date: 2008-09-01 00:06:57 UTC
List: ruby-list #45465
まつもと ゆきひろです

In message "Re: [ruby-list:45464] Ruby 1.9における異なるエンコーディングの文字列の結合"
    on Mon, 1 Sep 2008 08:32:45 +0900, rubikitch@ruby-lang.org writes:

|Ruby 1.9で異なるエンコーディングの文字列を結合するとエラーになりますが、
|将来的にレシーバのエンコーディングに変換して結合するようになりますか?
|あるいは、そのようなメソッドを新設する予定はありますか?
|もちろん相互変換可能という条件つきで。
|もしレシーバがUS-ASCIIならば引数のエンコーディングになるものとします。

どちらかがASCIIの範囲内の文字しか含まず、もう一方がASCII互換
のエンコーディングであった場合、結合は成功します。って、きっ
とそういう意味じゃないんですよね。

|予定がないとしたら、どういう問題があるのでしょうか?

「暗黙の変換は行わない」というのがRubyの基本的ポリシーだから
です。歴史的な事情その他から変換が本当に正しいかどうかは人間
にしかわからないので、結合のような基本的な操作で変換を暗黙に
行うのは危険だと考えます。

もちろん、「もっとユーザに優しく」とか「エンコーディングを意
識せずに」とかいう主張の「気持ち」は理解できるので、提案があ
れば耳を傾けるつもりはあります。

たとえば、今回話題になってるARGVのエンコーディングについてで
すが、現在は「ARGVに渡される文字列のエンコーディングはバイナ
リ」ではなくて、localeに従うようになっています。localeに設定
されたエンコーディングでファイル名を記述している限り、UNIX系
OSでは発生しない問題なのですね。

で、WindowsでもGetACP()を使ったコードページを指定しているよう
に見えるので、(現在では)実際はバイナリにならないんじゃないか
と思います。もしかしたら、この方が使ってらっしゃった1.9のバー
ジョンが古いのかもしれません。1.9.1に向けて日々進化中ですから。

ついでながら、これは「バイナリに適切なエンコーディングを付加
する」という話なので、「異なるエンコーディングを変換して処理」
では解決できない種類の問題ですね。バイナリは外からエンコーディ
ング情報を付加してやらないと変換できませんから。

guessは興味深いアプローチです。暗黙に行うと変換以上にダメージ
があるのですが、明示的に行うぶんには便利だと思います。が、あ
らゆるエンコーディングのguessを行うルーチンを組み込みにするの
は、まだ障害がありそうです。ライセンスのような非技術的なもの
も含めて。

                                まつもと ゆきひろ /:|)

In This Thread