如何在 ruby 中使用 utf8 的正则表达式
Posted
技术标签:
【中文标题】如何在 ruby 中使用 utf8 的正则表达式【英文标题】:How to use regex for utf8 in ruby 【发布时间】:2010-09-20 09:16:40 【问题描述】:在 RoR 中,如何验证带有 utf8 代码的发布表单的中文或日文单词。
在GBK代码中,它使用[\u4e00-\u9fa5]+来验证中文单词。 在 php 中,它使用 /^[\x4e00-\x9fa5]+$/u 来处理 utf-8 页面。
【问题讨论】:
【参考方案1】: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,不过。
编辑: 如 cmets 中所述,unicode 字符 \u4E00-\u9FA5 仅映射到 UTF16-BE 编码中的上述表达式。 UTF8 编码可能不同。所以你需要仔细分析映射,看看你能不能想出一个 Ruby 1.8 的字节匹配表达式。
【讨论】:
在使用 8 位正则表达式引擎(例如 Ruby 1.8 中的引擎)处理 UTF-8 文本时,您标记为“未测试”的正则表达式肯定不等同于 [\u4e00-\u9FA5]。您的正则表达式仅在使用 8 位正则表达式引擎处理 UTF-16BE 文本时才有效。【参考方案2】:这就是我所做的:
%r^[#"\344\270\200"-#"\351\277\277"]+$
这基本上是一个正则表达式,其八进制值表示 U+4E00 和 U+9FFF 之间的范围,这是最常见的中文和日文字符。
【讨论】:
【参考方案3】:Oniguruma 正则表达式引擎对 Unicode 有适当的支持。 Ruby 1.9 默认使用 Oniguruma。 Ruby 1.8 可以重新编译使用。
使用 Oniguruma,您可以使用与 PHP 中完全相同的正则表达式,包括 /u 修饰符以强制 Ruby 将字符串视为 UTF-8。
【讨论】:
【参考方案4】:activeSupport 有一个 UTF-8 处理程序
http://api.rubyonrails.org/classes/ActiveSupport/Multibyte/Handlers/UTF8Handler.html
否则,请查看 ruby 1.9,Regexp 对象的编码方法
【讨论】:
那是因为它自 ActiveSupport 2.1 以来已被弃用:apidock.com/rails/ActiveSupport/Multibyte/Handlers以上是关于如何在 ruby 中使用 utf8 的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章