2008-11-21 14 views
84

कई भाषाओं में फ़ंक्शन की एक जोड़ी है, chr() और ord(), जो संख्याओं और वर्ण मानों के बीच परिवर्तित होती है। कुछ भाषाओं में, ord() को asc() कहा जाता है।रुबी में chr() के विपरीत क्या है?

रूबी Integer#chr है, जो अच्छा काम करता है:

>> 65.chr 
A 

मेले पर्याप्त। लेकिन आप दूसरी तरफ कैसे जाते हैं?

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

प्रिंट:

65 

और कहा कि बहुत जो मैं चाहता करने के लिए करीब है। लेकिन मैं वास्तव में एक लूप से बचूंगा - const घोषित करते समय मैं पढ़ने योग्य होने के लिए पर्याप्त कुछ ढूंढ रहा हूं।

उत्तर

68

यदि स्ट्रिंग # ord 1.9 में मौजूद नहीं था, तो यह 2 में होता है।0:

"A".ord #=> 65 
+0

2.1 – Kostas

2

कैसे

के बारे में

डालता है एक

13

प्रयास करें:

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

अब रूबी 1.9 ने 'ए' [0] का अर्थ बदल दिया है, यह अधिक पोर्टेबल विधि है। – AShelly

3

साथ ही, आप एक स्ट्रिंग में चार है और आप एक पाश के बिना इसे डिकोड करने के लिए चाहते हैं:

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

रूबी में अप करने के लिए और 1.8 श्रृंखला सहित, निम्नलिखित दोनों 65 (ASCII के लिए) का उत्पादन करेगा:

puts ?A 
'A'[0] 

व्यवहार रूबी 1.9 में बदल गया है, इसके बाद के संस्करण के दोनों का उत्पादन करेगा 'ए' के ​​बजाय। रूबी 1.9 में ऐसा करने का सही तरीका है:

'A'[0].ord 

दुर्भाग्य से, ord विधि रूबी 1.8 में मौजूद नहीं है।

+0

यह दुर्भाग्यपूर्ण है कि रूबी 1.9 में "सही" तरीका इतना लंबा है, लेकिन कम से कम यह "ord" के लिए खोजों में आसान दिखाई देगा। आपके बहुत विस्तृत उत्तर के लिए धन्यवाद। – RJHunter

+2

'ए' [0] रूबी 1.8.7 में .ord शब्द - और उत्तर के लिए धन्यवाद। –

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 
$ 

मैं रूबी 1.8.1, 1.8.7 और 1.9.2 पर काम करने वाले कोड लिखने की कोशिश कर रहा हूं।

अपरकेस में अनपैक करने के लिए सी को पास करने के लिए संपादित किया गया है, क्योंकि अनपैक ("सी") मुझे -1 देता है जहां ord() मुझे 255 देता है (प्लेटफॉर्म पर चलने के बावजूद सी के चार पर हस्ताक्षर किए जाते हैं)।

1

आप इन कर सकते हैं:

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

बस, जबकि एक साथ RFC के माध्यम से Stringprep का एक शुद्ध रूबी संस्करण डाल इस बारे में जाना।

खबरदार कि chr बाहर विफल रहता है [0255] 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' और इसके विपरीत में यूनिकोड के मामले में विपरीत है – Munyari

2

आप एक सरणी से बाहर मूल्यों खींच कोई आपत्ति नहीं है, तो आप उपयोग कर सकते हैं "A".bytes

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

+0

जब उपयोगकर्ता 180 9 6 ने अपना उत्तर लिखा,' "ए" .unpack ("सी") [0 ] ', वह रुबी 1.8.1, रुबी 1.8.7 और रुबी 1.9.2 को लक्षित कर रहा था। क्या यह आपके पर्यावरण में विफल रहता है? किस तरह की विफलता? – RJHunter

+0

हाय आरजेएचंटर, मैं एक स्ट्रिंग में एक विशिष्ट वर्ण को अपने मूल्य मान में बदलने की कोशिश कर रहा हूं। निम्नलिखित कोड 1.9.3 में काम करता है लेकिन 1.8.6 नहीं। 'self.status = tagAccountString [4] .unpack (' c ') [0] ' 1.8.6 में मुझे ' 0 के लिए अपवाद अपरिभाषित विधि 'अनपैक' प्राप्त होता है: फिक्सनम प्रोसेसिंग मुख्य buffered टैग डेटा - बाहर निकलें निम्नलिखित वातावरण में कोड (मेरे प्रस्तावित समाधान के साथ) 'self.status = tagAccountString [4] .ord' कोई सलाह (उदाहरण के लिए एक बेहतर समाधान) स्वागत से अधिक है – hantscolin

+0

' टैग अकाउंटस्ट्रिंग [4] 'नए में एक स्ट्रिंग देता है रूबी लेकिन रुबी 1.8 में फिक्सनम वापस करने के लिए प्रयोग किया जाता था। यही कारण है कि आपने त्रुटि देखी, 'अपरिभाषित विधि 0 के लिए अनपॅक करें: Fixnum'। आप 'status = tagAccountString [4,1] .unpack ('c') [0]' या यहां तक ​​कि 'स्थिति, = tagAccountString.unpack (' xxxxC ')' का उपयोग कर सकते हैं, यदि आप हमेशा चार वर्णों को अनदेखा करना चाहते हैं और अगली कन्वर्ट करना चाहते हैं एक। स्पष्टीकरण और वैकल्पिक समाधान के लिए – RJHunter

संबंधित मुद्दे