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
.
Si String # ord n'existait pas en 1.9, il en existe en 2.0:
"A".ord #=> 65
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.
Essayer:
'A'.unpack('c')
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é).
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)>
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
Si cela ne vous dérange pas d'extraire les valeurs d'un tableau, vous pouvez utiliser "A".bytes
Que diriez-vous
met? A
Vous pouvez les avoir:
65.chr.ord
'a'.ord.chr
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