5
我在Ruby中的Kernel#sprintf
方法中遇到了一些混淆。在1.9中運行的Ruby sprintf
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所以th似乎並不是1.9.3所特有的。
也許我做錯了什麼?我不太熟悉Kernel#sprintf
方法。
我正在使用名爲ruby-smpp的smpp庫,它可以在github上找到。第#47行的send_concat_mt
方法在我嘗試在Ruby 1.9.3中運行時出現了。
如果你們中的任何一位能夠闡明這個問題,我將不勝感激。
它可能開始支持Unicode,因此行爲。我認爲你不應該依賴'sprintf'的這個「特性」。 – nhahtdh
是的,我們可以在我的例子中看到。 而你不厚我應該依靠ruby stdlib中的方法,其中的文檔在兩個版本中都表示相同? 正如我在我的問題中說,似乎我做錯了什麼 – Lisinge