在 RoR 中,如何验证带有 utf8 代码的张贴表单的中文或日文单词。
在GBK代码中,它使用[\u4e00-\u9fa5]+来验证中文单词。在 PHP 中,它使用 /^[\x{4e00}-\x{9fa5}]+$/u 来处理 utf-8 页面。
在 RoR 中,如何验证带有 utf8 代码的张贴表单的中文或日文单词。
在GBK代码中,它使用[\u4e00-\u9fa5]+来验证中文单词。在 PHP 中,它使用 /^[\x{4e00}-\x{9fa5}]+$/u 来处理 utf-8 页面。
Ruby 1.8 对 UTF-8 字符串的支持很差。您需要在正则表达式中单独写入字节,而不是完整的代码:
>> "acentuação".scan(/\xC3\xA7/)
=> ["ç"]
要匹配您指定的范围,表达式会变得有点复杂:
/([\x4E-\x9E][\x00-\xFF])|(\x9F[\x00-\xA5])/ # (untested)
编辑:如评论中所述,unicode 字符 \u4E00-\u9FA5 仅映射到 UTF16-BE 编码中的上述表达式。UTF8 编码可能不同。因此,您需要仔细分析映射,看看是否可以为 Ruby 1.8 提供字节匹配表达式。
这就是我所做的:
%r{^[#{"\344\270\200"}-#{"\351\277\277"}]+$}
这基本上是一个正则表达式,其八进制值表示 U+4E00 和 U+9FFF 之间的范围,这是最常见的中文和日文字符。
The Oniguruma regexp engine has proper support for Unicode. Ruby 1.9 uses Oniguruma by default. Ruby 1.8 can be recompiled to use it.
With Oniguruma you can use the exact same regex as in PHP, including the /u modifier to force Ruby to treat the string as UTF-8.
activeSupport 有一个 UTF-8 处理程序
http://api.rubyonrails.org/classes/ActiveSupport/Multibyte/Handlers/UTF8Handler.html
否则,请查看 ruby 1.9,Regexp 对象的编码方法