5

Kernel#sprintfRubyのメソッドについて混乱が生じています。

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}"

マジック コメントを使用してエンコーディングをバイナリ (ascii-8bit) に設定すると、エラーが発生します。

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でもこれを試したので、1.9.3に固有のものではないようです。

多分私は何か間違ったことをしていますか?私はそのKernel#sprintf方法にあまり詳しくありません。

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

どなたかがこの問題に光を当てていただければ幸いです。

4

1 に答える 1

1

sprintfのドキュメントには次のように記載されています。

Field |  Other Format 
------+--------------------------------------------------------------
  c   | Argument is the numeric code for a single character or
      | a single character string itself.

88599は、Ruby1.8のデフォルトの動作では1文字の有効な数値コードではありません。これはエンコーディングではないと思います。実行しているように見えるのは、指定した値に対してmod 256を実行してから、それを変換することです。

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

あなたが何か間違ったことをしていることに関しては、違います。何が起こったのかというと、範囲外の文字コードを許可することは、Ruby 1.9によって修正されたバグであり、現在は適切に例外をスローします。

于 2012-06-21T20:58:34.360 に答える