我对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修复,现在它正确地抛出了一个异常。