102

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

Ruby 有Integer#chr,效果很好:

>> 65.chr
A

很公平。但是你怎么走另一条路?

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

印刷:

65

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

4

10 回答 10

84

如果 String#ord 在 1.9 中不存在,它在 2.0 中存在:

"A".ord #=> 65
于 2013-12-10T17:50:39.023 回答
33

在 Ruby 直到 1.8 系列(包括 1.8 系列)中,以下都将产生 65(对于 ASCII):

puts ?A
'A'[0]

Ruby 1.9 中的行为发生了变化,以上两者都将产生“A”。在 Ruby 1.9 中执行此操作的正确方法是:

'A'[0].ord

不幸的是,ordRuby 1.8 中不存在该方法。

于 2008-11-21T14:19:09.260 回答
13

尝试:

'A'.unpack('c')
于 2008-11-21T13:44:17.957 回答
10

我想 +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 签名的平台上运行)。

于 2011-05-27T01:34:37.927 回答
4

刚刚通过 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)>
于 2014-04-05T05:51:49.883 回答
3

此外,如果您在字符串中有 char 并且您想在没有循环的情况下对其进行解码:

puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
于 2008-11-21T13:45:16.910 回答
2

怎么样

放?A

于 2008-11-21T13:32:08.030 回答
2

你可以拥有这些:

65.chr.ord
'a'.ord.chr
于 2014-03-10T19:38:07.103 回答
2

如果您不介意将值从数组中提取出来,您可以使用"A".bytes

于 2014-05-24T21:51:55.353 回答
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

于 2015-04-13T15:11:48.177 回答