Я использую Ruby 1.9 и пытаюсь выяснить, какой REGEX мне нужно сделать это верно:Как совместить слова юникода с ruby 1.9?
Encoding.default_internal = Encoding.default_external = 'utf-8'
"föö".match(/(\w+)/u)[1] == "föö"
# => false
Я использую Ruby 1.9 и пытаюсь выяснить, какой REGEX мне нужно сделать это верно:Как совместить слова юникода с ruby 1.9?
Encoding.default_internal = Encoding.default_external = 'utf-8'
"föö".match(/(\w+)/u)[1] == "föö"
# => false
# encoding=utf-8
p "föö".match(/\p{Word}+/)[0] == "föö"
О, я люблю тебя! – Hock
Сумасшедший, что вам нужно пометить исходный код как UTF8, чтобы заставить регулярное выражение корректно вести себя с правильной кодировкой. Большое спасибо ! – demental
Хорошую документацию для этого можно найти здесь: http://www.ruby-doc.org/core-1.9.3/Regexp.html#label-Character+Properties –
http://www.ruby-forum.com/topic/208777
и
http://www.ruby-forum.com/topic/210770
может иметь ключи для вас.
Вы можете также использовать (документированный) \p{L}
собственности, например:
$ ruby -ve "p '℉üüü' =~ /\p{L}/"
ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-linux]
1
Вы можете manually turn on Unicode matching используя внутренний (?u)
синтаксис:
"föö".match(/(?u)(\w+)/)[1] == "föö"
# => true
Однако, используя Unicode Синтаксис свойств (ответ steenslag) или POSIX Brackets Синтаксис - это лучший стиль, поскольку оба они автоматически учитывают коды Unicode:
"föö".match(/(\p{word}+)/)[1] == "föö"
# => true
"föö".match(/([[:word:]]+)/)[1] == "föö"
# => true
См. this blog post для получения дополнительной информации о соответствии символов Юникода в регулярных выражениях Ruby.
Вы должны преобразовать обе строки в один и тот же юникод, чем вы можете ее сопоставить. С Iconv вы можете преобразовать строку в определенный unicode. –
Добавлена кодировка по умолчанию. Все еще не работает ... – Reactormonk
Попробуйте разместить комментарий «# coding utf-8» в начале скрипта и убедитесь, что этот файл сценария - utf-8. – Nakilon