Как использовать регулярное выражение для utf8 в ruby

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

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

Ответ 1

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

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

Чтобы соответствовать указанному диапазону, выражение станет немного сложным:

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

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

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

Ответ 2

Это то, что я сделал:

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

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

Ответ 3

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

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