回答:
1.8シリーズまでのRubyでは、次の両方で65(ASCIIの場合)が生成されます。
puts ?A
'A'[0]
Ruby 1.9では動作が変更され、上記の両方で代わりに「A」が生成されます。Ruby 1.9でこれを行う正しい方法は次のとおりです。
'A'[0].ord
残念ながら、このord
メソッドはRuby 1.8には存在しません。
dylanfmとAShellyのコメントを+1したいのですが、[0]を追加します。
'A'.unpack('C')[0]
unpack呼び出しは、単一の整数を含む配列を返します。これは、整数が必要な場合に常に受け入れられるわけではありません。
$ ruby -e 'printf( "0x%02X \ n"、 "A" .unpack( "C"))' -e:1:in `printf ':配列を整数に変換できません(TypeError) -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を返し、ord()は255を返すため(Cのcharが署名されているプラットフォームで実行されているにもかかわらず)、Cを大文字でアンパックするように編集されました。
RFCを介して純粋なRubyバージョンのStringprepを作成しているときに、これに遭遇しました。
chr
[0,255]外で失敗することに注意してください。代わりに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
あり、Unicodeの場合はその逆です
さらに、文字列にcharがあり、ループなしでそれをデコードしたい場合:
puts 'Az'[0]
=> 65
puts 'Az'[1]
=> 122
あなたはこれらを持つことができます:
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
"A".unpack("C")[0]
、それはRuby 1.8.1、Ruby 1.8.7、Ruby 1.9.2を対象としていました。それはあなたの環境で失敗しますか?どんな失敗?
self.status = tagAccountString[4].unpack('C')[0]
1.8.6では私が取得 Exception undefined method
「:メインのバッファリングされたタグデータを処理するFixnumか-の両方の環境で(私の提案された解決策で)次のコードの作品をexit` 0アンパック self.status = tagAccountString[4].ord
より歓迎以上である(例えば、Aよりよい解決策を)何かアドバイスを
tagAccountString[4]
新しいルビーでは文字列を返しますが、Ruby 1.8ではFixnumを返すために使用されていました。そのため、エラーが表示されましたundefined method unpack for 0:Fixnum
。を使用することstatus = tagAccountString[4,1].unpack('C')[0]
もstatus, = tagAccountString.unpack('xxxxC')
、常に4文字を無視して次の文字を変換することもできます。