Ruby's String # gsub, Unicode и несловесные символы - PullRequest
12 голосов
/ 27 октября 2009

В рамках большей серии операций я пытаюсь взять токенизированные куски более крупной строки и избавиться от пунктуации, несвязного словаря и т. Д. В моей первоначальной попытке использовались String#gsub и регулярное выражение \W. класс персонажей, вот так:

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

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

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

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

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

Ответы [ 2 ]

12 голосов
/ 27 октября 2009

Вам нужно запустить 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> 

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

#!/usr/bin/ruby -Ku
4 голосов
/ 27 октября 2009

Я просто хотел бы добавить, что в 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.

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