Рубин:Как разбить потенциально юникодную строку на байты

StackOverflow https://stackoverflow.com/questions/144380

  •  02-07-2019
  •  | 
  •  

Вопрос

Я пишу игру, которая принимает вводимые пользователем данные и отображает их на экране.Движок, который я использую для этого, полностью поддерживает 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 модуль из кодовой базы рельсов.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top