Поддерживает ли Ruby юникод и как он работает? - PullRequest
31 голосов
/ 11 ноября 2010

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

Ответы [ 5 ]

31 голосов
/ 11 ноября 2010

То, что вы слышали, устарело и применяется (только частично) к 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.

15 голосов
/ 20 февраля 2012

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

# encoding: utf-8
14 голосов
/ 11 ноября 2010

Это не правда. Что правда, так это то, что Ruby не поддерживает только Unicode, он также поддерживает множество других кодировок.

Это в отличие от таких систем, как Java, .NET или Python, которые следуют модели «Одна кодировка, чтобы управлять всеми». В Ruby есть то, что один из разработчиков системы m17n в Ruby называет моделью «CSI» (Code Set Indepedent), что означает, что вместо всех строк, имеющих только одну и ту же кодировку, каждая строка помечается своей собственной кодировкой.

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

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

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

5 голосов
/ 27 ноября 2013

Это довольно старый вопрос.Текущая стабильная версия 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 справляется с основами - на более сложные строковые функции не следует рассчитывать.

0 голосов
/ 11 ноября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...