Рубин:Как разбить потенциально юникодную строку на байты
Вопрос
Я пишу игру, которая принимает вводимые пользователем данные и отображает их на экране.Движок, который я использую для этого, полностью поддерживает Unicode, поэтому я хотел бы сохранить его, если это вообще возможно.Проблема в том, что цикл рендеринга выглядит так:
"string".each_byte do |c|
render_this_letter(c)
end
Я не очень много знаю об i18n, но знаю достаточно, чтобы знать, что приведенный выше код будет работать только для меня и людей, говорящих на моем языке.Я бы предпочел что-то вроде:
"unicode string".each_unicode_letter do |u|
render_unicode_letter(u)
end
Существует ли это в основном дистрибутиве?Я несколько против добавления дополнительных требований к установке, но если это единственный способ сделать это, я переживу.
Для дополнительного развлечения у меня нет возможности узнать, действительно ли эта строка является строкой Юникода.
РЕДАКТИРОВАТЬ:Библиотека, которую я использую, действительно может отображать целые строки, однако я позволяю пользователю редактировать то, что появляется на лету - если он нажимает «backspace», по сути, мне нужно знать, сколько байтов нужно отрезать конец.
Решение
К сожалению, Ruby 1.8.x имеет плохую поддержку юникода.Это решается в 1.9.А между тем библиотеки вроде этой (http://snippets.dzone.com/posts/show/4527) являются хорошим решением.Используя связанную библиотеку, ваш код будет выглядеть примерно так:
"unicode_string".each_utf8_char do |u|
render_unicode_letter(u)
end
Другие советы
Вы можете попробовать включить ActiveSupport::CoreExtensions::String::Unicode модуль из кодовой базы рельсов.