sinonimo - ¿Qué es lo opuesto a chr() en Ruby?
presentar sinonimo (10)
Acabo de enterarme de esto al armar una versión pura de Ruby de Stringprep a través de RFCs.
Tenga en cuenta que el chr
falla afuera [0,255], en su lugar usa reemplazos portátiles 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)>
En muchos idiomas, hay un par de funciones, chr()
y ord()
, que convierten números y valores de caracteres. En algunos idiomas, ord()
se llama asc()
.
Ruby tiene Integer#chr
, que funciona genial:
>> 65.chr
A
Lo suficientemente justo. ¿Pero cómo vas por el otro lado?
"A".each_byte do |byte|
puts byte
end
huellas dactilares:
65
y eso es bastante parecido a lo que quiero. Pero prefiero evitar un bucle: estoy buscando algo lo suficientemente corto como para ser legible cuando declaro una const
.
Además, si tiene el carácter en una cadena y desea decodificarlo sin un bucle:
puts ''Az''[0]
=> 65
puts ''Az''[1]
=> 122
En Ruby hasta e incluyendo la serie 1.8, los siguientes producirán 65 (para ASCII):
puts ?A
''A''[0]
El comportamiento ha cambiado en Ruby 1.9, ambos de los anteriores producirán "A" en su lugar. La forma correcta de hacerlo en Ruby 1.9 es:
''A''[0].ord
Desafortunadamente, el método ord
no existe en Ruby 1.8.
Estoy escribiendo código para 1.8.6 y 1.9.3 y no pude conseguir que ninguna de estas soluciones funcionara en ambos entornos :(
Sin embargo, encontré otra solución: http://smajnr.net/2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html
Eso tampoco funcionó, pero lo adapté para mi uso:
unless "".respond_to?(:ord)
class Fixnum
def ord
return self
end
end
end
Una vez hecho esto, lo siguiente funcionará en ambos entornos
''A''[0].ord
Me gustaría +1 dylanfm y el comentario de AShelly, pero agregue el [0]:
''A''.unpack(''C'')[0]
La llamada de desempaquetado devuelve una matriz que contiene un entero único, que no siempre se acepta donde se desea un número entero:
$ 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 $
Intento escribir un código que funcione en Ruby 1.8.1, 1.8.7 y 1.9.2.
Editado para pasar C para descomprimir en mayúsculas, porque desempaquetar ("c") me da -1 donde ord () me da 255 (a pesar de correr en una plataforma donde está firmado el carácter de C).
Puedes tener estos:
65.chr.ord
''a''.ord.chr
Qué tal si
pone? A
Si String # ord no existía en 1.9, lo hace en 2.0:
"A".ord #=> 65
Si no te importa extraer los valores de una matriz, puedes usar "A".bytes
Tratar:
''A''.unpack(''c'')