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

Ruby String # gsub, unicode и символы без слов

Как часть более крупной серии операций, я пытаюсь использовать токенизированные фрагменты большей строки и избавляться от пунктуации, не-слова gobbledygook и т.д. Моя первоначальная попытка использовала String#gsub и \W regexp класс символов, например:

my_str = "Hello,"
processed = my_str.gsub(/\W/,'')
puts processed # => Hello

Супер, супер, супер просто. Конечно, теперь я расширяю свою программу, чтобы иметь дело с нелатинскими символами, и все черты сломались. Ruby \W кажется чем-то вроде [^A-Za-z0-9_], что, конечно, исключает вещи с диакритикой (ü, í и т.д.). Итак, теперь мой прежний простой код сбой и ожоги неприятным образом:

my_str = "Quística."
processed = my_str.gsub(/\W/,'')
puts processed # => Qustica

Обратите внимание, что gsub() обязуется удалить акцентированный символ "í". Один из способов, с помощью которого я решил исправить это, заключается в том, чтобы расширить белый список Ruby\W, чтобы включить более высокие кодовые точки Unicode, но их очень много, и я знаю, что я пропустил бы некоторые из них и вывел бы проблемы по линии (и пусть даже не задумывается о нелатинских языках...). Другим решением будет черный список всего, из чего я хочу избавиться (пунктуация, $/%/&/™ и т.д.), Но, опять же, там очень много, и я действительно не хочу начинать играя в черный список-удар-моль.

Кто-нибудь нашел принципиальное решение этой проблемы? Есть ли какая-то скрытая, Unicode-версия версии \W, которую я еще не обнаружил? Спасибо!

4b9b3361

Ответ 1

Вам нужно запустить ruby ​​с опцией -Ku, чтобы использовать UTF-8. См. Документацию для параметры командной строки. Это то, что происходит, когда я делаю это с irb:

% irb -Ku
irb(main):001:0> my_str = "Quística."
=> "Quística."
irb(main):002:0> processed = my_str.gsub(/\W/,'')
=> "Quística"
irb(main):003:0> 

Вы также можете поместить его на #! строка в рубине script:

#!/usr/bin/ruby -Ku

Ответ 2

Я хотел бы добавить, что в 1.9.1 он работает по умолчанию.

$ irb
ruby-1.9.1-p243 > my_str = "Quística."
=> "Quística."
ruby-1.9.1-p243 > processed = my_str.gsub(/\W/,'')
=> "Quística"
ruby-1.9.1-p243 > processed.encoding
=> #<Encoding:UTF-8>

PS. Ничто не сравнится rvm для тестирования разных версий Ruby. DS.