ruby 正则表达式在带有 utf8 字符的 Rails 中的奇怪行为
使用非标准 utf-8 字符时,我的验证正则表达式之一出现问题。因此,我进行了一些实验,发现 ruby 正则表达式在 Rails 环境或普通 ruby 中的行为有所不同。
我在这里发布了我用中文字符串进行的实验。
在ruby“pure”中:
string = "運動會"
puts string[/\A[\w]*\z/]
=> match "運動會" - ok
在rails中:
# coding: utf-8
task :test => :environment do
string = "運動會"
puts string[/\A[\w]*\z/]
end
$ rake test
=> nothing - not ok
如果我省略#coding: utf-8
,它会带有无效的多字节字符(US-ASCII)
。无论如何,即使这样,也不相符。
当然,我已经检查了所有内容(ruby_version,utf-8中脚本文件的编码..)
我使用:
- Rails 3.0.7
- Ruby 1.9.2(ruby-1.9.2-p180)
所以我的结论是rails改变了方式正则表达式的行为,我没有找到一种方法让它的行为像普通的红宝石。
I have problem with one of my validation regex when using nonstandard utf-8 character. So, I run a few experiments and it appears that ruby regex behave different when there are with rails environment or in plain ruby.
I post here my expriment with a Chinese string.
In ruby "pure" :
string = "運動會"
puts string[/\A[\w]*\z/]
=> match "運動會" - ok
In rails :
# coding: utf-8
task :test => :environment do
string = "運動會"
puts string[/\A[\w]*\z/]
end
$ rake test
=> nothing - not ok
If I omit # coding: utf-8
, it comes with invalid multibyte char (US-ASCII)
. Anyway, even with this, it doesn't match.
Of course, I have checked everything (ruby_version, encoding of script files in utf-8..)
I use :
- Rails 3.0.7
- Ruby 1.9.2 (ruby-1.9.2-p180)
So my conclusion is that rails alter the way regex behave and I did not find a way to make it behaves like in normal ruby.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
好的,我找到了问题的答案。
\w
仅对 ruby 1.9 中的 ascii 字符起作用,而对 ruby 1.8 中的所有 unicode 字符则起作用。在 ruby 1.9 中,现在我们必须使用:[\w\P{ASCII}]
更多信息:http://www.ruby-forum.com/topic/210770
Ok, I found an answer to my problem. The
\w
behaves only with ascii character in ruby 1.9 against all unicode caracter in ruby 1.8. In ruby 1.9, now we have to use :[\w\P{ASCII}]
More infos : http://www.ruby-forum.com/topic/210770