2016-06-14 17 views
7

Son zamanlarda Ruby chr ve ord yöntemleri ile çalışıyorum ve anlamadığım birkaç şey var.Ruby .chr ve .ord yöntemlerini anlamaya çalışıyorum

Şu anki projem, tek tek karakterlerin sıra değerlere ve sıra değerlerine dönüştürülmesini içeriyor. Anladığım kadarıyla, "A" gibi bir karakterle bir dizim varsa ve üzerinde ord numaralı telefonu ararsanız, 65 değeri ASCII tablosundaki konumunu alırım. Tersi çağrıldığında, 65.chr bana "A" karakter değerini verir. bu bana Ruby'nin karakterli karakter değerlerinin bulunduğu bir koleksiyona sahip olduğunu ve bu koleksiyonu belirli bir karakterin veya karakterin belirli bir pozisyondaki karakterini vermek için kullanabileceğini söyler. Bu konuda yanlış olabilirim, lütfen beni düzeltin.

Şimdi, Ruby'nin varsayılan karakter kodlamasının UTF-8'i kullandığını ve binlerce karakterle çalışabildiğini anlıyorum. Böyle bir şey için sormak Böylece eğer:

22909.chr 

ben "RangeError olsun:

'好'.ord 

O değerine chr ararsanız ben Ancak 22909. olduğunu karakterin pozisyonunu almak: 22909 aralığın dışında. " Sadece ASCII genişletilmiş 255'e kadar olan değerler üzerinde çalışmak için char elde edebiliyorum. Yani benim sorular şunlardır:

  • Neden Yakut set genişletilmiş ASCII karakter chr değerlerini alma gibi görünüyor ama UTF-8 den ord geliyor?
  • Ruby'ye bu yöntemleri kullandığında farklı kodlamaları kullanmasını söylemenin bir yolu var mı? Örneğin, varsayılan değer ne olursa olsun ASCII-8BIT kodlamasını kullanmasını söyle?
  • Varsayılan kodlamayı değiştirmek mümkün ise, kullanılan sette bulunan toplam karakter sayısını elde etmenin herhangi bir yolu var mı?
+6

http://apidock.com/ruby/Integer/chr '22909.chr (Encoding :: UTF_8) '' gibi bir şey kullanabileceğinizden bahseder. Kodlama, bunun yerine kullanmak istiyorsanız, '' Encoding :: ASCII_8BIT'' seçeneğine de sahiptir. –

+0

@NabeelAmjad Bunu bir cevap olarak göndermelisiniz. –

+0

Bu çok yardımcı oldu, bunu görmemiştim ve bu bana nereye gideceğime uzun bir yol katıyor. Şimdi, eksik olan tek şey, belirli bir kodlama için mevcut olan karakter sayısını elde etmenin basit bir yoludur. Örneğin ASCII_8BIT, 256 karakterden, yaklaşık 1 UTF_8 değerine sahiptir.1 milyon, ekt. Ve evet, lütfen cevap olarak gönderin. –

cevap

3

Integer#chr kodlamasına göre, kodlamayı UTF_8 olmaya zorlamak için aşağıdakileri kullanabilirsiniz.

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

mevcut tüm kodlama isimler

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

Bir süredir bu etrafında kalıp sonra, I fark

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

    x 
end 
#=> 1112064 
+0

Çok hoş, teşekkürler. En az karakter numarasını elde etmek için böyle bir şey denemeliydim korktum. Güzel değil, ama elimizde olanlarla çalışıyoruz, değil mi? Şerefe eş. –

0

maksimum karakter sayısını almak için bir hacky yolu listelemek için RangeError'ı atlatmayan en yüksek değeri bulmak için ikili bir arama çalıştırıp her kodlama için maksimum karakter sayısını alabilir.

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 

Yönteme verilen değer, kontrol edilen kodlamanın adıdır.