在许多语言中都有一对函数chr()
和ord()
,它们在数字和字符值之间进行转换。在某些语言中,ord()
称为asc()
。
Ruby有Integer#chr
,效果很好:
>> 65.chr
A
足够公平。但你怎么走另一条路呢?
"A".each_byte do |byte|
puts byte
end
打印:
65
这与我想要的非常接近。但我真的宁愿避免循环 - 我正在寻找一些足够短的东西,以便在声明const
时可读。
答案 0 :(得分:79)
如果1.9中不存在String#ord,则它在2.0中存在:
"A".ord #=> 65
答案 1 :(得分:33)
在Ruby(包括1.8系列)中,以下内容将产生65(对于ASCII):
puts ?A
'A'[0]
Ruby 1.9中的行为发生了变化,上述两种情况都会产生“A”。在Ruby 1.9中执行此操作的正确方法是:
'A'[0].ord
不幸的是,Ruby 1.8中不存在ord
方法。
答案 2 :(得分:13)
尝试:
'A'.unpack('c')
答案 3 :(得分:10)
我想+1 dylanfm和AShelly的评论,但添加[0]:
'A'.unpack('C')[0]
unpack调用返回一个包含单个整数的数组,在需要整数的地方并不总是接受:
$ ruby -e 'printf("0x%02X\n", "A".unpack("C"))' -e:1:in `printf': can't convert Array into Integer (TypeError) from -e:1 $ ruby -e 'printf("0x%02X\n", "A".unpack("C")[0])' 0x41 $
我正在尝试编写适用于Ruby 1.8.1,1.8.7和1.9.2的代码。
编辑传递C以大写形式解压缩,因为解压缩(“c”)给我-1,其中ord()给我255(尽管在C的char签名的平台上运行)。
答案 4 :(得分:3)
此外,如果您在字符串中有char并且想要在没有循环的情况下解码它:
puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
答案 5 :(得分:3)
刚刚通过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)>
答案 6 :(得分:2)
怎么样
放?A
答案 7 :(得分:2)
如果您不介意从数组中提取值,可以使用"A".bytes
答案 8 :(得分:1)
你可以拥有这些:
65.chr.ord
'a'.ord.chr
答案 9 :(得分:0)
我正在为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