From: "NARUSE, Yui" Date: 2008-01-24T00:05:47+09:00 Subject: [ruby-dev:33329] Re: Binary String 成瀬です。 Kouhei Sutou wrote: > そのPerlのuse utf8;相当のものが1.9のmagic commentというものに > あたると思っていたのですが、違うのでしょうか?で、magic > commentがついていないものはASCII-8BITになると思っていました。 > > そしてASCII-8BITがバイト列として(バイト列っぽく?)扱われる > のかなぁと思っていたので、1.9でも str[] あたりの挙動が変わっているというのと、端から端まで ASCII-8BIT で統 一しないとややこしくなるわけですが、Ruby 1.9 は magic comment を書かなく ても Encoding.default_external が ロケールなので、LANG=C 以外だと外から 入ってきたデータは ASCII-8BIT になります。 LANG=C だったとしても、transcode も nkf も iconv も通すと変換結果の string に encoding をつけるので、これにも気をつけないといけません。 >> 端的にいえば、Perl の文字列とは utf8 フラグのついたバイト列のことだった >> わけですが、デフォルトではつかなかったので、最初から最後までバイト列で通 >> してしまうということができました。 > > ということになって、既存のプログラムもそれっぽく動くのかなぁ > と思いました。(ASCII-8BITがバイト列として扱われるというのが > 間違い?) というわけで、端から端まで ASCII-8BIT で統一できれば、str[] とかを踏まな ければ動くのでしょうが、難しいように感じます。 >>>> そもそも 1.8 でも文字絡みの部分はちょくちょく変更入ってますからねぇ。nkf >>>> が 1.7 から 2.0 になったりとか。 >>> これは1.8.x間で互換性が失われている、つまり、既存のプログラム >>> が動かなくなるかもしれないということでしょうか? >> Ruby変更履歴が参考になりますかね。 >> http://www.ruby-lang.org/ja/man/html/Ruby_CAD1B9B9CDFACEF2.html > > nkf関連の変更は以下のようですが、これの影響で1.8.x間で互換性 > が失われているのでしょうか? > > ruby 1.8.2 feature: > > 2004-11-20 > > ext/nkf/nkf-utf8/ [lib] [new] > > utf8 対応 nkf (nkf 2.x) の追加。 > > 2004-12-04 > > NKF.guess [lib] [compat] > > NKF.guess は NKF.guess2 の alias になりました。 従来のものを使いたい場合は NKF.guess1 を使って下さい。 guess の戻り値が増えたり、変換表が微妙に変わったりしていますね。派手な変 更は入れる前に ML に出しているのでログを見てみるといいかもしれません。 > 気になったのはnkfの1.7->2.0が非互換性を生んでいるのかというこ > とでした。もう少し言えば > >>>> そもそも 1.8 でも文字絡みの部分はちょくちょく変更入ってますからねぇ。nkf >>>> が 1.7 から 2.0 になったりとか。 > > が何を言いたいのかがわからなかったということでもあります。私 > には「もう1.8.x間で非互換性があって動かないプログラムがあるん > だから、1.8/1.9間でも動かなくていいじゃん?」みたいに読めて > しまったので、「そんなことないよね?」と確認したかったんです。 Ruby が 1.8 の間互換性に重きを置いていたかというと、実際はそうでもなかっ た、と。で、それ以上に 1.9 での変更は大きいので、手を入れなくても動くも のは少ない。ゆえに動かなかったら手を入れてください、というところですかね。 > せっかくなので、ついでにStringについても見てみたのですが、互 > 換性が失われそうな記述は見つけられませんでした。1.8.x間では > なく1.8<->1.9の話でしょうか? jcode.rb あたりが変わっていたような、すいません、1.9と混同してるかも。 > # これは関係ないですが、 > 1.9でのStringの非互換性はString#[Integer]がIntegerではなく > Stringを返すことが一番大きいと思っているのですが(eachとかも > ありますけど)、そのときは > > if string[0] == ?a > > とか書いていると思うので、あまり変なことをしていない1.8で動い > ていたやつが1.9でもそれっぽく動くのでないかと思っています。 > 例えば、テキスト処理をしているHikiDocというやつは何もしなく > てもそれっぽく動いている気がします。 > (tDiaryは変なことをしているやつだと思う。) 意外と CGI とかは動きやすいかなーという気はしますね、LOCALE が C でしょ うから。どちらかというと、端末だと locale が絡むので encoding 絡みの問題 が顕在化しやすいように思います。 -- NARUSE, Yui DBDB A476 FDBD 9450 02CD 0EFC BCE3 C388 472E C1EA