web-dev-qa-db-fra.com

Quel est l'opposé de chr () en Ruby?

Dans de nombreuses langues, il existe une paire de fonctions, chr() et ord(), qui convertissent les nombres en valeurs de caractères. Dans certaines langues, ord() est appelée asc().

Ruby a Integer#chr, qui fonctionne très bien:

>> 65.chr
A

C'est suffisant. Mais comment allez-vous dans l'autre sens?

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

impressions:

65

et c'est assez proche de ce que je veux. Mais je préfère vraiment éviter une boucle - je cherche quelque chose d'assez court pour être lisible lors de la déclaration d'un const.

96
RJHunter

Si String # ord n'existait pas en 1.9, il en existe en 2.0:

"A".ord #=> 65
79
Rob Cameron

Dans Ruby jusqu'à et y compris la série 1.8, les éléments suivants produiront tous les deux 65 (pour ASCII):

puts ?A
'A'[0]

Le comportement a changé dans Ruby 1.9, les deux ci-dessus produiront plutôt "A". La façon correcte de le faire dans Ruby 1.9 est:

'A'[0].ord

Malheureusement, la méthode ord n'existe pas dans Ruby 1.8.

33
Robert Gamble

Essayer:

'A'.unpack('c')
13
dylanfm

Je voudrais attribuer +1 au commentaire de dylanfm et AShelly mais ajouter le [0]:

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

L'appel unpack renvoie un tableau contenant un seul entier, qui n'est pas toujours accepté là où un entier est souhaité:

 $ Ruby -e 'printf ("0x% 02X\n", "A" .unpack ("C"))' 
 - e: 1 : dans `printf ': impossible de convertir un tableau en entier (TypeError) 
 à partir de -e: 1 
 $ Ruby -e' printf (" 0x% 02X\n "," A ".unpack (" C ") [0]) '
 0x41 
 $ 
 $

J'essaie d'écrire du code qui fonctionne sur Ruby 1.8.1, 1.8.7 et 1.9.2.

Modifié pour passer C pour décompresser en majuscules, car décompresser ("c") me donne -1 où ord () me donne 255 (bien qu'il fonctionne sur une plateforme où le caractère de C est signé).

10
Martin Dorey

Je suis juste tombé sur cela en assemblant une version Ruby de Stringprep via RFC).

Attention, chr échoue en dehors de [0,255], utilisez plutôt des remplacements portables 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)>
4
user246672

De plus, si vous avez le caractère dans une chaîne et que vous souhaitez le décoder sans boucle:

puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
3
Kent Fredric

Si cela ne vous dérange pas d'extraire les valeurs d'un tableau, vous pouvez utiliser "A".bytes

2
Clark

Que diriez-vous

met? A

2
GregD

Vous pouvez les avoir:

65.chr.ord
'a'.ord.chr
1
Eduardo Santana

J'écris du code pour 1.8.6 et 1.9.3 et je n'ai pu faire fonctionner aucune de ces solutions dans les deux environnements :(

Cependant, je suis tombé sur une autre solution: http://smajnr.net/2009/12/Ruby-1-8-nomethoderror-undefined-method-ord-for-string.html

Cela n'a pas fonctionné pour moi non plus mais je l'ai adapté à mon usage:

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

Cela fait, les éléments suivants fonctionneront dans les deux environnements

'A'[0].ord
0
hantscolin