Ruby sprintf在1.9中表现出色

时间:2012-06-19 21:30:42

标签: ruby encoding printf

我在Ruby中的Kernel#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,因此似乎没有特定于1.9.3。

也许我做错了什么?我对Kernel#sprintf方法并不熟悉。

我正在使用名为ruby-smpp的smpp库,可以在github找到。当我尝试在Ruby 1.9.3中运行它时,第47行的send_concat_mt方法正在运行。

如果你们中的任何人能够对这件事情有所了解,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

sprintf文档声明:

Field |  Other Format 
------+--------------------------------------------------------------
  c   | Argument is the numeric code for a single character or
      | a single character string itself.
对于Ruby 1.8的默认行为,

88599不是单个字符的有效数字代码;我认为,这不是编码。它似乎正在做的是对你提供的值进行mod 256然后转换它:

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

至于你做错了什么,没有。发生的事情是允许越界字符代码是Ruby 1.9修复的错误,现在正好引发异常。