2012-06-19 12 views
5

RubyのKernel#sprintfメソッドで混乱が生じています。Ruby sprintfが1.9で動作する

Ruby 1.9は、Ruby 1.8とは異なる方法でエンコードを処理します。

ここで私は後だ結果であり、そしてどのようにそれは、Ruby 1.8で動作します。

>> RUBY_VERSION 
=> "1.8.7" 
>> sprintf("%c", 88599) 
=> "\027" 

これはRuby 1.9の中でどのように動作するかです:

1.9.3p194 :001 > RUBY_VERSION 
=> "1.9.3" 
1.9.3p194 :002 > sprintf("%c", 88599) 
=> "\u{15A17}" 

私はと魔法のコメントを使用している場合

1.9.3p194 :001 > RUBY_VERSION 
=> "1.9.3" 
1.9.3p194 :002 > # encoding: binary 
1.9.3p194 :003 > sprintf("%c", 88599) 
RangeError: 88599 out of char range 
from (irb):3:in `sprintf' 
from (irb):3 
from /Users/lisinge/.rvm/rubies/ruby-1.9.3-p194/bin/irb:16:in `<main>' 

私もRubyの1.9.2ので、目でこれを試してみました:私はエラーを取得するバイナリ(アスキー-8ビット)へのエンコーディングを設定します1.9.3に固有のようではありません。

多分私は何か間違っていますか?私はKernel#sprintfメソッドにあまり慣れていません。

私はgithubにあるruby-smppというsmppライブラリを使用しています。私がRuby 1.9.3で実行しようとしているときに動いているのは、#47行目のsend_concat_mtメソッドです。

あなたの誰かがこの問題について明らかにしていただければ幸いです。

+0

おそらく、Unicodeをサポートし始めるでしょう。私はあなたが 'sprintf'のこの"機能 "に頼るべきではないと思います。 – nhahtdh

+0

ええ、私は私の例でそれを見ることができます。 そして、私はruby stdlibのメソッドに頼るべきであるという厚さはありません。そのドキュメントは両方のバージョンで同じことを言っていますか? 私は私の質問で言っているように、私は何か間違っているようです – Lisinge

答えて

1

sprintfのドキュメントの状態:

Field | Other Format 
------+-------------------------------------------------------------- 
    c | Argument is the numeric code for a single character or 
     | a single character string itself. 
はルビー1.8のデフォルトの動作では、単一の文字のための有効な数値コードではありません。私はそれがエンコーディングではないと信じています。それは何をやっているように見えることは、あなたが提供する価値にMOD 256をやって、それを変換している:あなたが何か間違ったことに関しては

% irb 
1.9.3-p194 :003 > 88599 % 256 == 027 
=> true 

、ありません。何が起こったのかは、範囲外の文字コードを許可することが、Ruby 1.9で修正されたバグであり、今では例外が正しくスローされることです。

関連する問題