Ruby中chr()的反义词是什么?

时间:2008-11-21 13:27:54

标签: ruby ascii

在许多语言中都有一对函数chr()ord(),它们在数字和字符值之间进行转换。在某些语言中,ord()称为asc()

Ruby有Integer#chr,效果很好:

>> 65.chr
A

足够公平。但你怎么走另一条路呢?

"A".each_byte do |byte|
   puts byte
end

打印:

65

这与我想要的非常接近。但我真的宁愿避免循环 - 我正在寻找一些足够短的东西,以便在声明const时可读。

10 个答案:

答案 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