From: "NARUSE, Yui" Date: 2008-01-23T22:03:45+09:00 Subject: [ruby-dev:33323] Re: Binary String 成瀬です。 Kouhei Sutou wrote: > In <47972BD8.3090706@airemix.com> > "[ruby-dev:33321] Re: Binary String" on Wed, 23 Jan 2008 20:58:19 +0900, > "NARUSE, Yui" wrote: > >> いやー、だって、今 String はバイト列じゃなくなったんですよ、互換なわけな >> いじゃないですか。 >> >> ってのは言いすぎだとしても、わたしは Windows 3.1 -> Windows 95 くらいの >> 変更が行われていると思っていますし、Ruby より先に Unicode 化した Perl で >> ライブラリに軒並み utf8 対応の変更が入ったのも見ていますから、その辺の感 >> 覚は違うかもしれません。 > > Perlのことはよく知らないので教えてほしいのですが、Perlの > Unicode化の影響で(ライブラリではなくて)既存のプログラムは軒 > 並み動かなくなったのでしょうか?ライブラリがutf8対応したこと > で既存のプログラムは動くようになったのでしょうか? Perl の場合は decode しない限りバイト列のままなので、既存のバイト列はバ イト列のままでしたから、それまでのコードは動きました。Unicode が最初に導 入された Perl 5.6 の時点では Encode モジュールすら存在しなかったので、正 直なところみな バイト列のまま扱っていたように感じます。実際に移行が始 まったのは 5.8 ですかね。5.8 になってバイト列と文字列が混在し始めると混 乱が起きたように記憶しています。 端的にいえば、Perl の文字列とは utf8 フラグのついたバイト列のことだった わけですが、デフォルトではつかなかったので、最初から最後までバイト列で通 してしまうということができました。 一方の Ruby 1.9 はいきなり今までバイト列だったものが原則文字列に変わって しまいました。Perl 5.6 の時のようにバイト列で通そうとしても $KCODE はな くなっていますから部分部分では何とかなってもプログラム全体では難しいと思 います。 つまり、Ruby 1.9 はデフォルトで encoding をつけるので Perl より思い切っ たというかなんというか。 > # Perlでは軒並み動かなくなったのだったらRubyの場合もそうなる > # のかなぁと。 事情を知らずに use utf8; (リテラルに utf8 フラグ ≒ encoding をつける) を やった日には泥沼にはまった物ですが、Ruby 1.9 はデフォルトでそれが付いて いる状態ですね。 >> そもそも 1.8 でも文字絡みの部分はちょくちょく変更入ってますからねぇ。nkf >> が 1.7 から 2.0 になったりとか。 > > これは1.8.x間で互換性が失われている、つまり、既存のプログラム > が動かなくなるかもしれないということでしょうか? Ruby変更履歴が参考になりますかね。 http://www.ruby-lang.org/ja/man/html/Ruby_CAD1B9B9CDFACEF2.html バージョンアップの度に微妙な非互換が発生していたため、ビジネスでの利用が 広まりつつあった 1.8 系からまつもとさんを隔離しようというのが 1.9 のリ リースを急いだ理由の一つだという噂がまことしやかに。 -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA