web-dev-qa-db-ja.com

Rubyのchr()の反対は何ですか?

多くの言語には、chr()ord()のペアがあり、数値と文字値の間で変換を行います。一部の言語では、ord()asc()と呼ばれます。

RubyにはInteger#chr、それは素晴らしい作品です:

>> 65.chr
A

けっこうだ。しかし、どのように他の方法で行くのですか?

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

プリント:

65

それは私が望むものにかなり近いです。しかし、私は本当にループを避けたいと思います-constを宣言するときに読み込めるほど短いものを探しています。

96
RJHunter

String#ordが1.9に存在しなかった場合、2.0には存在します。

"A".ord #=> 65
79
Rob Cameron

Ruby 1.8シリーズまで)では、次の両方が65(ASCIIの場合)を生成します。

puts ?A
'A'[0]

Ruby 1.9で動作が変更され、上記の両方が代わりに「A」を生成します。Ruby 1.9でこれを行う正しい方法は次のとおりです。

'A'[0].ord

残念ながら、ordメソッドはRuby 1.8。には存在しません。

33
Robert Gamble

試してください:

'A'.unpack('c')
13
dylanfm

DylanfmとAShellyのコメントを+1しますが、[0]を追加します。

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

Unpack呼び出しは、単一の整数を含む配列を返しますが、整数が必要な場合は常に受け入れられるとは限りません。

 $ Ruby -e 'printf( "0x%02X\n"、 "A" .unpack( "C"))' 
-e:1 :in `printf ':配列を整数に変換できません(TypeError)
 from -e:1 
 $ Ruby -e' printf(" 0x% 02X\n "、" A ".unpack(" C ")[0]) '
 0x41 
 $ 

Ruby 1.8.1、1.8.7、および1.9.2で動作するコードを記述しようとしています。

Unpack( "c")が-1を返すので、Cを大文字でアンパックするように編集されました。ここで、ord()は255を返します(Cのcharが署名されているプラ​​ットフォームで実行しているにもかかわらず)。

10
Martin Dorey

RFCを介してStringprepの純粋なRubyバージョンを作成しているときにこれに遭遇しました。

[0,255]の外部でchrが失敗することに注意してください。代わりに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)>
4
user246672

さらに、文字列にcharがあり、ループなしでそれをデコードする場合:

puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
3
Kent Fredric

配列から値を引き出すことを気にしない場合は、"A".bytesを使用できます

2
Clark

どう?

置く?

2
GregD

あなたはこれらを持つことができます:

65.chr.ord
'a'.ord.chr
1
Eduardo Santana

私は1.8.6と1.9.3のコードを書いていますが、これらのソリューションを両方の環境で動作させることはできませんでした:(

しかし、私は別のソリューションに出会いました: http://smajnr.net/2009/12/Ruby-1-8-nomethoderror-undefined-method-ord-for-string.html

それは私にとってもうまくいきませんでしたが、私はそれを自分の使用に適合させました:

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

それを行った後、以下は両方の環境で動作します

'A'[0].ord
0
hantscolin