Dans de nombreuses langues, il existe une paire de fonctions, chr()
et ord()
, qui convertissent entre les nombres et les valeurs de caractères. Dans certaines langues, ord()
est appelé asc()
.
Ruby a Integer#chr
, ce 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
imprime:
65
et c'est assez proche de ce que je veux. Mais je préfère vraiment éviter une boucle - je recherche quelque chose d'assez court pour être lisible lors de la déclaration d'un fichier const
.
Essayer:
la source
J'aimerais 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, ce qui n'est pas toujours accepté là où un entier est souhaité:
J'essaye d'écrire du code qui fonctionne sur Ruby 1.8.1, 1.8.7 et 1.9.2.
Édité pour passer C pour décompresser en majuscules, car unpack ("c") me donne -1 où ord () me donne 255 (malgré l'exécution sur une plate-forme où le caractère de C est signé).
la source
Je viens de tomber sur cela lors de la création d'une version Ruby pure de Stringprep via RFC.
Attention qui
chr
échoue en dehors de [0,255], utilisez plutôt des remplacements portables 1.9.x - 2.1.x:la source
char
et son inverse dans le cas d'unicode correctementDe plus, si vous avez le char dans une chaîne et que vous souhaitez le décoder sans boucle:
la source
Que diriez-vous
la source
Vous pouvez avoir ceux-ci:
la source
Si cela ne vous dérange pas d'extraire les valeurs d'un tableau, vous pouvez utiliser
"A".bytes
la source
J'écris du code pour 1.8.6 et 1.9.3 et je n'ai pas réussi à faire fonctionner l'une 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:
Après avoir fait cela, alors ce qui suit fonctionnera dans les deux environnements
la source
"A".unpack("C")[0]
cela ciblait Ruby 1.8.1, Ruby 1.8.7 et Ruby 1.9.2. Cela échoue-t-il dans votre environnement? Quel genre d'échec?self.status = tagAccountString[4].unpack('C')[0]
Dans la version 1.8.6, je reçoisException undefined method
unpack 'for 0: Fixnum traitant les données des balises tamponnées principales - exit` Le code suivant fonctionne (avec ma solution proposée) dans les deux environnements.self.status = tagAccountString[4].ord
Tout conseil (par exemple, une meilleure solution) est plus que bienvenutagAccountString[4]
renvoie une chaîne dans les Rubis plus récents mais utilisée pour renvoyer un Fixnum dans Ruby 1.8. Voilà pourquoi vous avez vu l'erreur,undefined method unpack for 0:Fixnum
. Vous pouvez utiliserstatus = tagAccountString[4,1].unpack('C')[0]
ou mêmestatus, = tagAccountString.unpack('xxxxC')
si vous voulez toujours ignorer quatre caractères et convertir le suivant.