2016-06-14 15 views
7

Pracuję ostatnio z metodami Ruby chr i ord i jest kilka rzeczy, których nie rozumiem.Próba zrozumienia metod Ruby .chr i .ord

Mój obecny projekt obejmuje konwersję pojedynczych znaków do wartości porządkowych i od wartości porządkowych. Jak rozumiem, jeśli mam ciąg znaków z indywidualnym znakiem, takim jak "A" i nazywam go ord, otrzymuję jego pozycję w tabeli ASCII, która wynosi 65. Wywołanie odwrotności, 65.chr daje mi wartość znaku "A", więc to mówi mi, że Ruby ma kolekcję gdzieś z uporządkowanych wartości znaków, i może użyć tej kolekcji, by podać mi pozycję konkretnej postaci lub postaci na określonej pozycji. Mogę się mylić, proszę, popraw mnie, jeśli tak.

Teraz rozumiem również, że domyślne kodowanie znaków Ruby wykorzystuje UTF-8, dzięki czemu może pracować z tysiącami możliwych znaków. Jeśli więc pytam go o coś takiego:

'好'.ord 

uzyskać pozycję tego znaku, który jest 22909. Jednakże, jeśli zadzwonię chr na tej wartości:

22909.chr 

otrzymuję „RangeError: 22909 poza zasięgiem char. " Mogę uzyskać tylko char do pracy na wartościach do 255, które są rozszerzone ASCII. Więc moje pytania to:

  • Dlaczego Ruby wydają się być coraz wartości chr z rozszerzonego znak ASCII ustawiony ale ord z UTF-8?
  • Czy jest jakiś sposób, aby powiedzieć Ruby, aby używała różnych kodowań, gdy używa tych metod? Na przykład, powiedz, aby używać kodowania ASCII-8BIT zamiast tego, do czego jest domyślne?
  • Jeśli istnieje możliwość zmiany domyślnego kodowania, czy istnieje sposób uzyskania całkowitej liczby znaków dostępnych w używanym zestawie?
+6

http://apidock.com/ruby/Integer/chr wspomina, że ​​możesz użyć czegoś takiego jak '' 22909.chr (Encoding :: UTF_8) ''. Kodowanie ma również '' Kodowanie :: ASCII_8BIT'', jeśli chcesz go użyć zamiast tego. –

+0

@NabeelAmjad Powinieneś opublikować to jako odpowiedź. –

+0

To bardzo pomocne, nie widziałem tego, a to doprowadza mnie daleko do miejsca, do którego zmierzam. Jedyne, czego mi brakuje to prosty sposób na uzyskanie liczby znaków dostępnych dla określonego kodowania. Na przykład ASCII_8BIT ma 256 znaków, UTF_8 około 1.1 milion, ect. I tak, proszę zaksięguj to jako odpowiedź. –

Odpowiedz

3

Zgodnie z Integer#chr można użyć następujących poleceń, aby wymusić kodowanie UTF_8.

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

Do listy wszystkich dostępnych Kodowanie imiona

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

hacky sposób, aby uzyskać maksymalną liczbę znaków

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

    x 
end 
#=> 1112064 
+0

Bardzo ładne, dziękuję. Bałem się, że będę musiał spróbować czegoś takiego, aby uzyskać maksymalną liczbę postaci. Nie ładne, ale pracujemy z tym, co mamy, prawda? Pozdrawiam kumpla. –

0

Po oprzyrządowania dokoła z tym na chwilę, uświadomiłem sobie, że może uzyskać maksymalną liczbę znaków dla każdego kodowania, uruchamiając wyszukiwanie binarne, aby znaleźć najwyższą wartość, która nie rzuci wyjątku 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 

Wartość podawana w metodzie to nazwa sprawdzanego kodowania.

Powiązane problemy