可以将文章内容翻译成中文,广告屏蔽插件可能会导致该功能失效(如失效,请关闭广告屏蔽插件后再试):
问题:
In many languages there's a pair of functions, chr()
and ord()
, which convert between numbers and character values. In some languages, ord()
is called asc()
.
Ruby has Integer#chr
, which works great:
>> 65.chr A
Fair enough. But how do you go the other way?
"A".each_byte do |byte| puts byte end
prints:
65
and that's pretty close to what I want. But I'd really rather avoid a loop -- I'm looking for something short enough to be readable when declaring a const
.
回答1:
If String#ord didn't exist in 1.9, it does in 2.0:
"A".ord #=> 65
回答2:
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.
回答3:
回答4:
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).
回答5:
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
回答6:
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:
回答7:
回答8:
If you don't mind pulling the values out of an array, you can use "A".bytes
回答9:
You can have these:
65.chr.ord 'a'.ord.chr
回答10:
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