2008-11-21 66 views
84

在許多語言中,有一對函數,chr()ord(),它們在數字和字符值之間進行轉換。在某些語言中,ord()被稱爲asc()Ruby中chr()的反義詞是什麼?

Ruby有Integer#chr,偉大的工程:

>> 65.chr 
A 

很公平。但你怎麼去另一種方式?

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

打印:

65 

,這就是非常接近我想要的東西。但我真的寧願避免循環 - 我正在尋找足夠短的內容來聲明const

回答

68

如果String#ord在1.9中不存在,它在2中。0:

"A".ord #=> 65 
+0

也適用於2.1 – Kostas 2014-07-20 21:17:49

13

嘗試:?

'A'.unpack('c') 
+1

現在Ruby 1.9改變了'A'[0]的含義,這是更便攜的方法。 – AShelly 2008-11-22 01:11:18

3

此外,如果你有一個字符串的字符,你想它沒有環解碼:

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

在Ruby直至幷包括1.8系列,以下將兩者產生65(爲ASCII):

puts ?A 
'A'[0] 

行爲Ruby 1.9中發生了變化,上述兩個會產生「A」來代替。在Ruby 1.9中做到這一點,正確的方法是:

'A'[0].ord 

不幸的是,ord方法不使用Ruby 1.8存在。

+0

不幸的是,Ruby 1.9中的「正確」方式是如此之久,但至少它在搜索「ord」時會更容易。 感謝您的非常詳細的答案。 – RJHunter 2008-11-22 11:30:23

+2

'A'[0]紅寶石1.8.7中的詞語 - 感謝您的回答。 – 2009-03-08 15:04:17

10

我想1 dylanfm和AShelly的評論,但是添加[0]:

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

解包調用返回包含單個整數,這並不總是接受陣列,其中一個整數是想通過:

 
$ 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被簽名的平臺上運行)。

1

你可以有這些:

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

過這個剛剛來到同時通過RFC文檔放在一起STRINGPREP的純Ruby版本。

當心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)> 
+0

謝謝,這似乎是給`char`及其在unicode的正確 – Munyari 2016-08-13 16:25:37

2

如果你不介意的拉動值從一個數組,你可以使用"A".bytes