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


100

多くの言語には、数値と文字値の間で変換を行う2つの関数、chr()およびord()があります。一部の言語でord()は、と呼ばれasc()ます。

RubyにはInteger#chrがあります。

>> 65.chr
A

けっこうだ。しかし、あなたはどうやって他の道を行くのですか?

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

プリント:

65

そしてそれは私が望むものにかなり近いです。しかし、私は実際にはループを避けたいと思いますconst

回答:



33

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

puts ?A
'A'[0]

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

'A'[0].ord

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


Ruby 1.9の「正しい」方法が非常に長いのは残念ですが、少なくとも「ord」を検索すると簡単に表示されます。非常に詳細な回答をありがとうございます。
RJHunter 2008年

13

試してください:

'A'.unpack('c')

1
Ruby 1.9が 'A' [0]の意味を変更したため、これはより移植性の高い方法です。
AShelly 2008年

10

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を大文字でアンパックするように編集されました。


4

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の場合はその逆です
Munyari





0

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


user18096が回答を書いたとき"A".unpack("C")[0]、それはRuby 1.8.1、Ruby 1.8.7、Ruby 1.9.2を対象としていました。それはあなたの環境で失敗しますか?どんな失敗?
RJHunter 2015

こんにちはRJHunterです。文字列内の特定の文字を数値に変換しようとしています。次のコードは1.9.3では機能しますが、1.8.6では機能しません。 self.status = tagAccountString[4].unpack('C')[0] 1.8.6では私が取得 Exception undefined method 「:メインのバッファリングされたタグデータを処理するFixnumか-の両方の環境で(私の提案された解決策で)次のコードの作品をexit` 0アンパック self.status = tagAccountString[4].ord より歓迎以上である(例えば、Aよりよい解決策を)何かアドバイスを
hantscolin

tagAccountString[4]新しいルビーでは文字列を返しますが、Ruby 1.8ではFixnumを返すために使用されていました。そのため、エラーが表示されましたundefined method unpack for 0:Fixnum。を使用することstatus = tagAccountString[4,1].unpack('C')[0]status, = tagAccountString.unpack('xxxxC')、常に4文字を無視して次の文字を変換することもできます。
RJHunter 2015

説明と代替ソリューションについてRJHunterに感謝します。「私の」ソリューションは、より読みやすく、再利用可能であるとして、(正当な理由があまり存在しない場合を除き?)しかし、私はそれに固執するだろう
hantscolin
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.