我对Kernel#sprintf
Ruby 中的方法感到有些困惑。
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
方法不是很熟悉。
我正在使用一个名为 ruby-smpp 的 smpp 库,它可以在github上找到。send_concat_mt
当我尝试在 Ruby 1.9.3 中运行它时,它是第 47 行的方法。
如果你们中的任何人能对此事有所了解,我将不胜感激。