2010-08-30 3 views
4

В приложении Rails (2.3, Ruby 1.8.7) мне нужно усечь строку до определенной длины. строка является unicode, и при запуске тестов на консоли, например 'א'.length, я понял, что возвращается двойная длина. Я хотел бы иметь длину кодирования-агностик, так что такое же усечение было бы сделано для строки unicode или строки с кодировкой latin1.Длина строки unicode

Я просмотрел большую часть материала Unicode для Ruby, но все еще немного в темноте. Как решить эту проблему?

ответ

4

Rails имеет метод mb_chars, который возвращает многобайтовые символы. Попробуйте unicode_string.mb_chars.slice(0,50)

+0

Вот что я в конечном счете используется: http://pastie.org/1129327 – shmichael

0

Вы можете использовать что-то вроде str.chars.slice(0, 50).join, чтобы получить первые 50 символов строки, независимо от того, сколько байтов оно использует для каждого символа.

+0

В консоли, я получаю 'неопределенный метод' срез»для # <перечислимых :: Enumerator: 0xb67a0ed4>' – shmichael

3
"ア".size # 3 in 1.8, 1 in 1.9 
puts "ア".scan(/./mu).size # 1 in both 1.8 and 1.9 
1

chars и mb_chars не дают вам текстовые элементы, что и вы, кажется, ищет.

Для текстовых элементов вам понадобится unicode gem.

mb_chars:

>> 'กุ'.mb_chars.size 
=> 2 

>> 'กุ'.mb_chars.first.to_s 
=> "ก" 

text_elements:

>> Unicode.text_elements('กุ').size 
=> 1 

>> Unicode.text_elements('กุ').first 
=> "กุ" 
Смежные вопросы