Как использовать регулярные выражения для utf8 в ruby - PullRequest
11 голосов
/ 02 ноября 2008

В RoR, как проверить китайское или японское слово для формы публикации с кодом utf8.

В коде GBK он использует [\ u4e00- \ u9fa5] + для проверки китайских слов. В Php он использует / ^ [\ x {4e00} - \ x {9fa5}] + $ / u для страниц utf-8.

Ответы [ 4 ]

10 голосов
/ 02 ноября 2008

Ruby 1.8 плохо поддерживает строки UTF-8. Вам нужно писать байты индивидуально в регулярном выражении, а не полный код:

>> "acentuação".scan(/\xC3\xA7/)
=> ["ç"]    

Для соответствия заданному вами диапазону выражение станет немного сложнее:

/([\x4E-\x9E][\x00-\xFF])|(\x9F[\x00-\xA5])/  # (untested)

Это будет улучшено в Ruby 1.9 , хотя.

Редактировать: Как отмечалось в комментариях, символы Юникода \ u4E00- \ u9FA5 отображаются только на вышеприведенное выражение в кодировке UTF16-BE. Кодировка UTF8, вероятно, отличается. Поэтому вам нужно тщательно проанализировать сопоставление и посмотреть, сможете ли вы придумать выражение для сопоставления байтов для Ruby 1.8.

3 голосов
/ 28 декабря 2009

Вот что я сделал:

%r{^[#{"\344\270\200"}-#{"\351\277\277"}]+$}

Это в основном регулярное выражение с восьмеричными значениями, которые представляют диапазон между U + 4E00 и U + 9FFF, наиболее распространенными китайскими и японскими символами.

2 голосов
/ 03 ноября 2008

Движок Oniguruma regexp имеет надлежащую поддержку Unicode. Ruby 1.9 по умолчанию использует Oniguruma. Ruby 1.8 может быть перекомпилирован для использования.

С Oniguruma вы можете использовать те же регулярные выражения, что и в PHP, включая модификатор / u, чтобы заставить Ruby рассматривать строку как UTF-8.

1 голос
/ 02 ноября 2008

activeSupport имеет обработчик UTF-8

http://api.rubyonrails.org/classes/ActiveSupport/Multibyte/Handlers/UTF8Handler.html


в противном случае посмотрите ruby ​​1.9, метод кодирования для объектов Regexp

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