Подтвердить что ты не робот

Поддерживает ли Ruby юникод и как он работает?

Я только начинаю изучать Ruby (чтобы в конечном итоге перейти к RoR), но мне просто сказали, что Ruby не поддерживает unicode. Это правда? Как программисты Ruby поддерживают поддержку unicode?

4b9b3361

Ответ 1

То, что вы слышали, устарело и применяется (только частично) к Ruby 1.8 или ранее. Последняя стабильная версия Ruby (1.9) поддерживает не менее 95 различные кодировки символов (в настоящее время учитывается моя система). Это включает в себя почти все известные форматы преобразования Unicode, включая UTF-8.

Предыдущая стабильная версия Ruby (1.8) имеет частичную поддержку для UTF-8.

Если вы используете Rails, он позаботится о кодировке UTF-8 по умолчанию. Если вам нужно только знать кодировку UTF-8, Rails будет работать для вас независимо от того, запускаете ли вы Ruby 1.9 или Ruby 1.8. Если у вас очень специфические требования к кодировке символов, вы должны стремиться к Ruby 1.9.

Если вам действительно интересно, вот серия статей, описывающая проблемы с кодированием в Ruby 1.8 и способы их работы; в конечном итоге решена в Ruby 1.9. Rails по-прежнему включает обходные пути для многих распространенных ошибок в Ruby 1.8.

Ответ 2

Добавление следующей строки поверх моего файла разрешило ее.

# encoding: utf-8

Ответ 3

Это не так. Верно то, что Ruby не поддерживает только Unicode, он также поддерживает целый ряд других кодировок.

Это контрастирует с такими системами, как Java,.NET или Python, которые следуют модели "One Encoding To Rule Them All". Ruby имеет то, что один из разработчиков системы Ruby m17n вызывает модель "CSI" (Code Set Indepedent), что означает, что вместо всех строк, имеющих только одну и ту же кодировку, каждая строка помечена своей собственной кодировкой.

Это имеет некоторые существенные преимущества как для удобства использования, так и для производительности, поскольку это означает, что если ваши кодировки ввода и вывода одинаковы, вам никогда не нужно перекодировать, тогда как при модели One True Encoding вам необходимо перекодировать дважды в худший случай (и этот худший случай, к сожалению, случается довольно часто, потому что большинство из этих сред выбрали внутреннюю кодировку, которую никто фактически не использует), от входной кодировки во внутреннюю кодировку, а затем до выходной кодировки. В Ruby вам нужно перекодировать не более одного раза.

Основная проблема с моделью OTE заключается в том, что независимо от того, какую кодировку вы выбрали в качестве True True Encoding, это будет совершенно произвольный выбор, поскольку просто нет единой кодировки, которую используют все или даже большинство.

В Java, например, они выбрали UCS-2 в качестве True True Encoding. Затем, через пару лет, оказалось, что UCS-2 на самом деле недостаточно для кодирования всех символов, поэтому им пришлось сделать обратно-несовместимое изменение в Java, чтобы переключиться на UTF-16 как единое True Encoding. За исключением того времени, значительная часть мира перешла от UTF-16 к UTF-8. Если бы Java была изобретена несколькими годами ранее, они, вероятно, выбрали бы ASCII как единую True Encoding. Если бы он был изобретен в другой стране, это может быть Shift-JIS. Если бы это было изобретено другой компанией, это может быть EBCDIC. Это действительно совершенно произвольно, и такого важного выбора не должно быть.

Ответ 4

Это довольно старый вопрос. Текущая стабильная версия Ruby 2.0.1. Да, он обрабатывает большую часть того, что вы можете использовать в Unicode, но помните, что он довольно легко ломается.

Взгляните на этот образец кода и результаты (вдохновленный this):

["noël","😸😾","baffle"].each do |str|
  puts "Result for '#{str}'"
  puts "  Size: #{str.size}"
  puts "  Reverse: [#{str.reverse}]"
  puts "  Uppercase: [#{str.upcase}]"
end  

Result for 'noël'
  Size: 5 << bad size
  Reverse: [l̈eon] <= accent is shifted
  Uppercase: [NOËL]
Result for '😸😾'
  Size: 2
  Reverse: [😾😸]
  Uppercase: [😸😾]
Result for 'baffle'
  Size: 4
  Reverse: [efflab] <= doesn't really make sense
  Uppercase: [BAfflE] <= should be "ELFFAB"

Дело в том, что современный Ruby обрабатывает основы - не следует учитывать более сложные функции строки.

Ответ 5

В этом ответе на другой вопрос, один человек сказал, что у них возникли проблемы с Iconv при работе с данными Unicode в Ruby 1.9, но я не могу ручаться за его точность.