作者热门文章
- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我对 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-8 位),我会得到一个错误:
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 行的方法出现问题。
如果你们中的任何人能对此事有所了解,我将不胜感激。
最佳答案
sprintf 文档指出:
Field | Other Format
------+--------------------------------------------------------------
c | Argument is the numeric code for a single character or
| a single character string itself.
88599 不是 Ruby 1.8 默认行为中单个字符的有效数字代码;我相信,这不是编码。它似乎在做的是对您提供的值进行 mod 256,然后进行转换:
% irb
1.9.3-p194 :003 > 88599 % 256 == 027
=> true
至于你做错了什么,没有。实际发生的是,允许越界字符代码是 Ruby 1.9 修复的错误,现在可以正确抛出异常。
关于Ruby sprintf 在 1.9 中发挥作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11109746/
在 Play 1.x 中有很棒的 play Idealize(和 play eclipsify),它为您最喜欢的 IDE 中的 Play 项目准备了项目文件。 我看到这是在 Play 2.X 中删除的
我是一名优秀的程序员,十分优秀!