What's the opposite of chr() in Ruby?

匿名 (未验证) 提交于 2019-12-03 02:16:02

问题:

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:

Try:

'A'.unpack('c') 


回答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:

How about

puts ?A



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

'A'[0].ord


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!