我对ruby中的Kernel#sprintf方法感到困惑。
Ruby1.9处理编码的方式与Ruby1.8不同。
下面是我想要的结果,以及它在Ruby1.8中的表现:

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

这就是它在Ruby1.9中的表现:
1.9.3p194 :001 > RUBY_VERSION
=> "1.9.3"
1.9.3p194 :002 > sprintf("%c", 88599)
=> "\u{15A17}"

如果使用magic注释将编码设置为二进制(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>'

我也在Ruby1.9.2中尝试过,所以似乎没有针对1.9.3的。
也许我做错了什么?我不太熟悉Kernel#sprintf方法。
我正在使用一个名为ruby smpp的smpp库,它可以在github上找到。当我试图在Ruby1.9.3中运行它时,第47行的send_concat_mt方法出现了问题。
如果你们能对此事有所了解,我将不胜感激。

最佳答案

sprintf文档说明:

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

在Ruby1.8的默认行为中,88599不是单个字符的有效数字代码;我相信,它不是编码。它似乎是在对您提供的值执行mod 256,然后将其转换为:
% irb
1.9.3-p194 :003 > 88599 % 256 == 027
 => true

至于你做错了什么,没有。发生的事情是,允许越界字符代码是一个错误,已经被Ruby1.9修复,现在它正确地抛出了一个异常。

08-16 04:00