Quel est le contraire du chr() en Ruby?
Dans de nombreuses langues, il y a une paire de fonctions, chr()
et ord()
, qui convertir entre les nombres et les valeurs de caractères. Dans certaines langues, ord()
est appelé asc()
.
Ruby a Integer#chr
, qui fonctionne très bien:
>> 65.chr
A
Assez juste. Mais comment voulez-vous aller dans l'autre sens?
"A".each_byte do |byte|
puts byte
end
imprime:
65
et c'est à peu près ce que je veux. Mais j'aurais vraiment préféré éviter une boucle -- je suis à la recherche de quelque chose d'assez court pour être lisible lorsque l'on déclare une const
.
Vous devez vous connecter pour publier un commentaire.
Si la Chaîne#ord n'existait pas en 1.9, il n'en 2.0:
En Ruby jusqu'à et y compris le 1.8 de la série, la suite sera à la fois de produire de 65 ans (pour ASCII):
Le comportement a changé en Ruby 1.9, les deux ci-dessus va produire "Un" à la place. La manière correcte de le faire en Ruby 1.9:
Malheureusement, la
ord
méthode n'existe pas dans Ruby 1.8.Essayer:
J'aimerais +1 dylanfm et AShelly commentaire, mais ajouter de l' [0]:
'A'.unpack('C')[0]
Le décompresser appel renvoie un Tableau contenant un entier, ce qui n'est pas toujours acceptée si un entier est voulu:
Je suis en train d'écrire du code qui fonctionne sur Ruby 1.8.1, 1.8.7 et 1.9.2.
Édité à passer à C de déballer en majuscules, parce que unpack("c") me donne -1 où ord() me donne 255 (en dépit de l'exécution sur une plate-forme où C char est signé).
En outre, si vous avez le caractère dans une chaîne et que vous souhaitez décoder sans boucle:
Viens de tomber sur ce tout en mettant ensemble un pur Ruby version de Stringprep via Rfc.
Attention,
chr
ne parvient pas à l'extérieur [0,255], au lieu d'utiliser 1.9.x - 2.1.x portable de remplacement:char
et son inverse dans le cas de l'unicode correctementComment sur
Si vous n'avez pas l'esprit en tirant les valeurs d'un tableau, vous pouvez utiliser
"A".bytes
Vous pouvez avoir ces:
Je suis en train d'écrire le code pour 1.8.6 et 1.9.3 et je n'arrivais pas à obtenir une de ces solutions fonctionnent dans les deux environnements 🙁
Cependant, j'ai trouvé une autre solution:
http://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
Qui ne fonctionne pas pour moi non plus, mais j'ai adapté pour mon utilisation:
HTML:
Après avoir fait cela, puis les suivants fonctionnent dans les deux environnements
HTML:
"A".unpack("C")[0]
, qui a été le ciblage Ruby 1.8.1, Ruby 1.8.7 et Ruby 1.9.2. Elle ne répond en rien dans votre environnement? Ce type de panne?self.status = tagAccountString[4].unpack('C')[0]
Dans 1.8.6-je obtenirException undefined method
décompresser "pour 0:Fixnum traitement principal tampon des données de tag - sortie" Le code suivant fonctionne (avec ma proposition de solution) dans les deux environnementsself.status = tagAccountString[4].ord
des conseils (par exemple, une meilleure solution) est plus que bienvenuetagAccountString[4]
retourne une Chaîne de caractères dans les nouvelles versions Rubis, mais permet de retourner une Fixnum en Ruby 1.8. C'est 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 souhaitez ignorer les quatre personnages et de les convertir à la prochaine.