如何在ruby中使用regex for utf8

时间:2008-11-02 12:06:18

标签: ruby-on-rails ruby regex utf-8

在RoR中,如何使用utf8代码验证中文或日语单词的发布形式。

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

4 个答案:

答案 0 :(得分:10)

Ruby 1.8对UTF-8字符串的支持不足。您需要在正则表达式中单独写入字节,而不是完整的代码:

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

要匹配您指定的范围,表达式将变得有点复杂:

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

That will be improved in Ruby 1.9

编辑:如评论中所述,unicode字符\ u4E00- \ u9FA5仅映射到UTF16-BE编码中的上述表达式。 UTF8编码可能不同。因此,您需要仔细分析映射,看看是否可以为Ruby 1.8提供字节匹配表达式。

答案 1 :(得分:3)

这就是我所做的:

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

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

答案 2 :(得分:2)

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

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

答案 3 :(得分:1)

activeSupport具有UTF-8处理程序

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


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