如何在Ruby中使用正则表达式处理UTF-8编码的文本

11

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

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

4个回答

9

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


你标记为“未测试”的正则表达式在使用像 Ruby 1.8 中的 8 位正则表达式引擎处理 UTF-8 文本时,肯定不等同于 [\u4e00-\u9FA5]。只有在使用 8 位正则表达式引擎处理 UTF-16BE 文本时,你的正则表达式才能起作用。 - Jan Goyvaerts

3
这是我所做的事情:
%r{^[#{"\344\270\200"}-#{"\351\277\277"}]+$}

这实际上是一个正则表达式,其中包含代表U+4E00至U+9FFF范围内最常见的中日文字符的八进制值。


2
Oniguruma正则表达式引擎对Unicode提供了适当的支持。Ruby 1.9默认使用Oniguruma。Ruby 1.8可以重新编译以使用它。
使用Oniguruma,您可以使用与PHP完全相同的正则表达式,包括/u修饰符,强制Ruby将字符串视为UTF-8。

1

这是因为自 ActiveSupport 2.1 版本以来已经被弃用了:http://apidock.com/rails/ActiveSupport/Multibyte/Handlers - Leonid Shevtsov

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接