2016-06-14 3 views
7

最近Ruby chrordのメソッドで作業していましたが、理解できないことがいくつかあります。Rubyの.chrと.ordのメソッドを理解しようとしています

私の現在のプロジェクトでは、個々の文字を順序値との間で変換します。私が理解しているように、 "A"のような個々の文字列を持っていて、その上にordを呼び出すと、ASCIIテーブルの位置が65になります。逆数値を呼び出すと、65.chrは私に文字値 "A"を与えます。これは、Rubyが順序付けられた文字の値のどこかにコレクションを持ち、このコレクションを使用して、特定の文字または特定の位置の文字の位置を私に与えることができることを示しています。私はこれについて間違っているかもしれません、私がいれば私を修正してください。

Rubyのデフォルトの文字エンコーディングはUTF-8を使用しているため、何千もの文字を使用できることも理解しています。私はこのような何かのためにそれを求めるならこのように:

22909.chr 

私は「例外RangeErrorを得る:

'好'.ord 

私はその値にchrを呼び出す場合、しかし22909.でその文字の位置を取得します: char範囲外の22909です。私はcharを拡張ASCIIである255までの値に作用させることしかできません。だから、私の質問は以下のとおりです。

  • なぜRubyはUTF-8から拡張ASCII文字セットからchrの値を取得しているように見えるが、ordのでしょうか?
  • Rubyにこれらのメソッドを使用するときに異なるエンコーディングを使用するように指示する方法はありますか?例えば、デフォルトにしているものの代わりにASCII-8BITエンコーディングを使用するように指示しますか?
  • デフォルトのエンコードを変更することができる場合は、使用可能な文字の総数を取得する方法はありますか?
+6

http://apidock.com/ruby/Integer/chrには、 '' 22909.chr(Encoding :: UTF_8) ''のようなものを使うことができます。エンコーディングには、代わりに '' Encoding :: ASCII_8BIT''があります。 –

+0

@NabeelAmjad答えとして投稿する必要があります。 –

+0

これは非常に役に立ちました。私はそれを見ていなかったので、これは私がどこに行くのかを私に遠くまで伝えます。今私が欠けているのは、特定のエンコーディングに使用できる文字数を取得する簡単な方法です。たとえば、ASCII_8BITは256文字、UTF_8は約1文字です。100万人はい、回答として投稿してください。 –

答えて

3

Integer#chrによれば、次のコードを使用してエンコードを強制的にUTF_8にすることができます。

22909.chr(Encoding::UTF_8) 
#=> "好" 

は、利用可能なすべてのエンコーディング名

Encoding.name_list 
#=> ["ASCII-8BIT", "UTF-8", "US-ASCII", "UTF-16BE", "UTF-16LE", "UTF-32BE", "UTF-32LE", "UTF-16", "UTF-32", ...] 

にしばらくの間、これで周りツーリングの後、私は気づい

2000000.times.reduce(0) do |x, i| 
    begin 
    i.chr(Encoding::UTF_8) 
    x += 1 
    rescue 
    end 

    x 
end 
#=> 1112064 
+0

非常にいいです、ありがとう。私は最大文字数を得るためにそれを試してみなければならないのではないかと心配しました。きれいではありませんが、私たちは私たちが持っているものを使っています。 乾杯。 –

0

文字の最大数を取得するためのハック方法を一覧表示するにはバイナリ検索を実行してRangeErrorを投げない最高の値を見つけることで、各エンコーディングの最大文字数を得ることができます。

def get_highest_value(set) 
    max = 10000000000 
    min = 0 
    guess = 5000000000 

    while true 
    begin guess.chr(set) 
     if (min > max) 
     return max 
     else 
     min = guess + 1 
     guess = (max + min)/2 
     end 
    rescue 
     if min > max 
     return max 
     else 
     max = guess - 1 
     guess = (max + min)/2 
     end 
    end 
    end 
end 

このメソッドに渡される値は、チェックされるエンコーディングの名前です。

関連する問題