2016-06-14 3 views
7

Недавно я работал с методами Ruby chr и ord, и есть несколько вещей, которые я не понимаю.Попытка понять методы Ruby .chr и .ord

Мой текущий проект включает в себя преобразование отдельных символов в и из порядковых значений. Как я понимаю, если у меня есть строка с индивидуальным символом типа «A», и я вызываю ord, я получаю ее позицию в таблице ASCII, которая равна 65. Вызов обратного, 65.chr дает мне значение символа «A», поэтому это говорит мне, что Ruby имеет коллекцию где-то из упорядоченных значений символа, и она может использовать эту коллекцию, чтобы дать мне позицию определенного символа или персонажа в определенной позиции. Возможно, я ошибаюсь, пожалуйста, поправьте меня, если я есть.

Теперь я также понимаю, что кодировка символов по умолчанию Ruby использует UTF-8, поэтому она может работать с тысячами возможных символов. Таким образом, если я попрошу его что-то вроде этого:

'好'.ord 

я получаю позицию этого символа, который 22909. Однако, если я позвоню chr этого значения:

22909.chr 

я получаю «RangeError: 22909 из диапазона. Я могу получить только char для работы с значениями до 255, которые расширены ASCII. Так что мои вопросы:

  • Почему Руби, кажется, получать значения chr из расширенного символа ASCII установлен, но ord из UTF-8?
  • Есть ли способ сказать 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.1 миллион, ect. И да, пожалуйста, разместите его как ответ. –

ответ

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", ...] 

А Hacky способ получить максимальное количество символов

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

    x 
end 
#=> 1112064 
+0

Очень приятно, спасибо. Я боялся, что мне придется попробовать что-то подобное, чтобы получить номер максимального символа. Не очень, но мы работаем с тем, что имеем, не так ли? Cheers мат. –

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 

Значение, переданное методу, - это имя проверяемого кодирования.

Смежные вопросы