Lis*_*nge 5 ruby encoding printf
我Kernel#sprintf在Ruby中的方法上遇到了一些困惑.
Ruby 1.9以与Ruby 1.8不同的方式处理编码.
以下是我追求的结果,以及它在Ruby 1.8中的表现:
>> RUBY_VERSION
=> "1.8.7"
>> sprintf("%c", 88599)
=> "\027"
Run Code Online (Sandbox Code Playgroud)
这就是它在Ruby 1.9中的表现:
1.9.3p194 :001 > RUBY_VERSION
=> "1.9.3"
1.9.3p194 :002 > sprintf("%c", 88599)
=> "\u{15A17}"
Run Code Online (Sandbox Code Playgroud)
如果我使用魔术注释将编码设置为二进制(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>'
Run Code Online (Sandbox Code Playgroud)
我也尝试过使用Ruby 1.9.2,因此似乎没有特定于1.9.3.
也许我做错了什么?我对这种Kernel#sprintf方法并不熟悉.
我正在使用一个名为ruby-smpp的smpp库,它可以在github上找到.send_concat_mt当我试图在Ruby 1.9.3中运行它时,它就是第47行的方法.
如果你们中的任何人能够对这个问题有所了解,我将不胜感激.
sprintf 文档指出:
Field | Other Format
------+--------------------------------------------------------------
c | Argument is the numeric code for a single character or
| a single character string itself.
Run Code Online (Sandbox Code Playgroud)
在 Ruby 1.8 的默认行为中,88599 不是单个字符的有效数字代码;我相信这不是编码。它似乎正在做的是对您提供的值进行 mod 256,然后将其转换:
% irb
1.9.3-p194 :003 > 88599 % 256 == 027
=> true
Run Code Online (Sandbox Code Playgroud)
至于你做错了什么,没有。实际发生的情况是,允许越界字符代码是一个错误,已由 Ruby 1.9 修复,现在可以正确抛出异常。
| 归档时间: |
|
| 查看次数: |
380 次 |
| 最近记录: |