多くの言語には、chr()
とord()
のペアがあり、数値と文字値の間で変換を行います。一部の言語では、ord()
はasc()
と呼ばれます。
RubyにはInteger#chr
、それは素晴らしい作品です:
>> 65.chr
A
けっこうだ。しかし、どのように他の方法で行くのですか?
"A".each_byte do |byte|
puts byte
end
プリント:
65
それは私が望むものにかなり近いです。しかし、私は本当にループを避けたいと思います-const
を宣言するときに読み込めるほど短いものを探しています。
String#ordが1.9に存在しなかった場合、2.0には存在します。
"A".ord #=> 65
Ruby 1.8シリーズまで)では、次の両方が65(ASCIIの場合)を生成します。
puts ?A
'A'[0]
Ruby 1.9で動作が変更され、上記の両方が代わりに「A」を生成します。Ruby 1.9でこれを行う正しい方法は次のとおりです。
'A'[0].ord
残念ながら、ord
メソッドはRuby 1.8。には存在しません。
試してください:
'A'.unpack('c')
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が署名されているプラットフォームで実行しているにもかかわらず)。
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)>
さらに、文字列にcharがあり、ループなしでそれをデコードする場合:
puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
配列から値を引き出すことを気にしない場合は、"A".bytes
を使用できます
どう?
置く?
あなたはこれらを持つことができます:
65.chr.ord
'a'.ord.chr
私は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