Frage

In vielen Sprachen gibt es ein paar Funktionen, chr() und ord(), die zwischen Zahlen und Zeichenwerten zu konvertieren. In einigen Sprachen ord() wird asc() genannt.

Ruby hat Integer#chr, die großen Werke:

>> 65.chr
A

Fair enough. Aber wie gehen Sie in die andere Richtung?

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

druckt:

65

und das ist ziemlich nahe, was ich will. Aber ich würde wirklich eher eine Schleife vermeiden. - Ich bin auf der Suche nach etwas kurz genug, um lesbar zu sein, wenn eine const erklärt

War es hilfreich?

Lösung

Wenn String # ord nicht in 1.9 vorhanden ist, tut es in 2.0:

"A".ord #=> 65

Andere Tipps

In Ruby bis einschließlich der 1,8-Serie, die folgenden werden beide produzieren 65 (für ASCII):

puts ?A
'A'[0]

Das Verhalten hat in Ruby 1.9 geändert, die beide der oben produzieren „A“ statt. Der richtige Weg, dies in Ruby zu tun 1.9 ist:

'A'[0].ord

Leider ist die ord Methode existiert nicht in Ruby 1.8.

Versuchen:

'A'.unpack('c')

Ich möchte +1 dylanfm und AShelly Kommentar aber fügen Sie die [0]:

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

Der auspacken Aufruf gibt ein Array eine einzelne ganze Zahl enthält, die nicht immer akzeptiert wird, wo eine ganze Zahl gesucht:

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

Ich versuche, Code zu schreiben, der auf Rubin arbeitet 1.8.1, 1.8.7 und 1.9.2.

Herausgegeben C passieren in Groß auspacken, weil auspacken ( "c") gibt mir -1 wo ord () me 255 gibt (trotz läuft auf einer Plattform, wo C die char unterzeichnet wird).

kam gerade über diesen während der Zusammenstellung eine reine Ruby-Version von Stringprep über RFCs.

Beachten Sie, dass chr nicht außerhalb [0255], statt 1.9.x verwenden - 2.1.x tragbaren Ersatz:

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

Wenn Sie darüber hinaus die Zeichen in einer Zeichenkette haben, und Sie wollen, sie entschlüsseln, ohne eine Schleife:

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

Wie wäre es

  

puts? A

Wenn Sie nichts dagegen haben die Werte aus einem Array ziehen, können Sie "A".bytes verwenden

Sie können diese haben:

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

Ich schreibe Code für 1.8.6 und 1.9.3 und ich konnte keine dieser Lösungen erhalten in beiden Umgebungen zu arbeiten: (

Allerdings stieß ich auf eine andere Lösung: http://smajnr.net /2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html

Das ist nicht für mich entweder nicht funktioniert, aber ich passte es für meine Verwendung:

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

Nachdem das getan, dann wird folgende in beiden Umgebungen arbeiten

'A'[0].ord

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top