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

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

Ruby 有 Integer#chr,效果很好:

>> 65.chr
A

有道理,但是你怎么走另一条路呢?

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

印刷品:

65

这和我想要的差不多。但是我真的宁愿避免一个循环——我正在寻找在声明 const时足够简短以便可读的内容。

84609 次浏览

How about

puts ?A

Try:

'A'.unpack('c')

Additionally, if you have the char in a string and you want to decode it without a loop:

puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122

In Ruby up to and including the 1.8 series, the following will both produce 65 (for ASCII):

puts ?A
'A'[0]

The behavior has changed in Ruby 1.9, both of the above will produce "A" instead. The correct way to do this in Ruby 1.9 is:

'A'[0].ord

Unfortunately, the ord method doesn't exist in Ruby 1.8.

I'd like to +1 dylanfm and AShelly's comment but add the [0]:

'A'.unpack('C')[0]

The unpack call returns an Array containing a single integer, which is not always accepted where an integer is wanted:

$ 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
$

I'm trying to write code that works on Ruby 1.8.1, 1.8.7 and 1.9.2.

Edited to pass C to unpack in uppercase, because unpack("c") gives me -1 where ord() gives me 255 (despite running on a platform where C's char is signed).

If String#ord didn't exist in 1.9, it does in 2.0:

"A".ord #=> 65

You can have these:

65.chr.ord
'a'.ord.chr

Just came across this while putting together a pure Ruby version of Stringprep via RFCs.

Beware that chr fails outside [0,255], instead use 1.9.x - 2.1.x portable replacements:

[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)>

If you don't mind pulling the values out of an array, you can use "A".bytes

I'm writing code for 1.8.6 and 1.9.3 and I couldn't get any of these solutions to work in both environments :(

However, I came across another solution: http://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html

That didn't work for me either but I adapted it for my use:

unless "".respond_to?(:ord)
class Fixnum
def ord
return self
end
end
end

Having done that, then the following will work in both environments

'A'[0].ord