在许多语言中,有一对函数chr()
和ord()
,它们在数字和字符值之间进行转换。在某些语言中,ord()
称为asc()
.
Ruby 有Integer#chr
,效果很好:
>> 65.chr
A
很公平。但是你怎么走另一条路?
"A".each_byte do |byte|
puts byte
end
印刷:
65
这与我想要的非常接近。但我真的宁愿避免循环——我正在寻找足够短的东西,以便在声明const
.
如果 String#ord 在 1.9 中不存在,它在 2.0 中存在:
"A".ord #=> 65
在 Ruby 直到 1.8 系列(包括 1.8 系列)中,以下都将产生 65(对于 ASCII):
puts ?A
'A'[0]
Ruby 1.9 中的行为发生了变化,以上两者都将产生“A”。在 Ruby 1.9 中执行此操作的正确方法是:
'A'[0].ord
不幸的是,ord
Ruby 1.8 中不存在该方法。
尝试:
'A'.unpack('c')
我想 +1 dylanfm 和 AShelly 的评论,但添加 [0]:
'A'.unpack('C')[0]
unpack 调用返回一个包含单个整数的数组,在需要整数的地方并不总是接受它:
$ ruby -e 'printf("0x%02X\n", "A".unpack("C"))' -e:1:in `printf': 无法将 Array 转换为 Integer (TypeError) 从 -e:1 $ ruby -e 'printf("0x%02X\n", "A".unpack("C")[0])' 0x41 $
我正在尝试编写适用于 Ruby 1.8.1、1.8.7 和 1.9.2 的代码。
编辑通过 C 以大写形式解包,因为 unpack("c") 给我 -1 其中 ord() 给我 255(尽管在 C 的 char 签名的平台上运行)。
刚刚通过 RFC 组合纯 Ruby 版本的 Stringprep 时遇到了这个问题。
请注意,chr
在 [0,255] 之外失败,请改用 1.9.x - 2.1.x 便携式替代品:
[22] pry(main)> "\u0221".ord.chr
RangeError: 545 out of char range
from (pry):2:in 'chr'
[23] pry(main)> x = "\u0221".unpack('U')[0]
=> 545
[24] pry(main)> [x].pack('U')
=> "ȡ"
[25] pry(main)>
此外,如果您在字符串中有 char 并且您想在没有循环的情况下对其进行解码:
puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
怎么样
放?A
你可以拥有这些:
65.chr.ord
'a'.ord.chr
如果您不介意将值从数组中提取出来,您可以使用"A".bytes
我正在为 1.8.6 和 1.9.3 编写代码,但我无法让这些解决方案中的任何一个在这两种环境中工作:(
但是,我遇到了另一个解决方案: http ://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
这对我也不起作用,但我对其进行了调整以供我使用:
unless "".respond_to?(:ord)
class Fixnum
def ord
return self
end
end
end
完成此操作后,以下内容将在两种环境中均有效
'A'[0].ord