Pergunta

Em muitas línguas há um par de funções, chr() e ord(), que convertem entre números e valores de caracteres. Em alguns idiomas, ord() é chamado asc().

Ruby tem Integer#chr, que funciona muito bem:

>> 65.chr
A

É justo. Mas como você ir por outro caminho?

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

impressões:

65

e isso é muito perto do que eu quero. Mas eu realmente prefiro evitar um loop -. Eu estou procurando algo curto o suficiente para ser lido ao declarar uma const

Foi útil?

Solução

Se String # ord não existia no 1.9, que faz em 2.0:

"A".ord #=> 65

Outras dicas

Em Ruby até e incluindo a série 1.8, o seguinte será tanto produzir 65 (para ASCII):

puts ?A
'A'[0]

O comportamento mudou no Ruby 1.9, ambos acima irá produzir "A" em seu lugar. A maneira correta de fazer isso em Ruby 1.9 é:

'A'[0].ord

Infelizmente, o método ord não existe no Ruby 1.8.

Tente:

'A'.unpack('c')

Eu gostaria de um dylanfm e comentário de AShelly mas adicionar a [0]:

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

A chamada descompactar retorna um array contendo um único inteiro, o que nem sempre é aceito, onde um inteiro é procurado:

$ 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
$ 

Eu estou tentando escrever código que funciona em Rubi 1.8.1, 1.8.7 e 1.9.2.

Editado passar C para desempacotar em maiúsculas, porque descompactar ( "c") me -1 dá onde ord () me dá 255 (apesar de correr em uma plataforma onde caractere de C é assinado).

Apenas me deparei com este ao montar uma versão Ruby puro de Stringprep via RFCs.

Tenha em atenção que chr falhar fora [0255], em vez usar 1.9.x - 2.1.x substituições portáteis:

[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)>

Além disso, se você tem o caractere em uma string e você quer para decodificá-lo sem um loop:

puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122

Como cerca

puts? A

Se você não se importa puxando os valores de um array, você pode usar "A".bytes

Você pode ter estes:

65.chr.ord
'a'.ord.chr

Eu estou escrevendo código para 1.8.6 e 1.9.3 e eu não poderia obter qualquer destas soluções para trabalhar nos dois ambientes: (

No entanto, me deparei com uma outra solução: http://smajnr.net /2009/12/ruby-1-8-nomethoderror-undefined-method-ord-for-string.html

Isso não funcionou para mim também, mas eu adaptei-lo para o meu uso:

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

Depois de ter feito isso, então o seguinte irá trabalhar em ambientes

'A'[0].ord

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top