如何在ruby中使用正则表达式的utf8

在RoR中,如何使用utf8代码validation中文或日语单词的发布表单。

在GBK代码中,它使用[\ u4e00- \ u9fa5] +来validation中文单词。 在Php中,它使用/ ^ [\ x {4e00} – \ x {9}} + $ / u来表示utf-8页面。

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提供字节匹配表达式。

这就是我所做的:

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

这基本上是一个正则表达式,其八进制值表示U + 4E00和U + 9FFF之间的范围,这是最常见的中文和日文字符。

Oniguruma regexp引擎对Unicode有适当的支持。 Ruby 1.9默认使用Oniguruma。 可以重新编译Ruby 1.8以使用它。

使用Oniguruma,您可以使用与PHP完全相同的正则表达式,包括/ u修饰符,以强制Ruby将字符串视为UTF-8。

activeSupport有一个UTF-8处理程序

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


否则,请查看ruby 1.9,Regexp对象的编码方法