在Rails中使用UTF-8字符时,Ruby正则表达式的行为很奇怪

9

我在使用非标准utf-8字符时遇到了一个验证正则表达式的问题。因此,我进行了一些实验,发现当在Rails环境或纯Ruby中使用时,Ruby正则表达式的行为是不同的。

下面是我的一个中文字符串实验:

在纯Ruby中:

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,就会出现invalid multibyte char (US-ASCII)。无论如何,即使有这个,它也不匹配。
当然,我已经检查了一切(ruby_version,脚本文件的编码为utf-8..)
我使用:
Rails 3.0.7 Ruby 1.9.2 (ruby-1.9.2-p180)
所以我的结论是,Rails改变了正则表达式的行为方式,我没有找到一种方法让它像普通的ruby一样运行。

1
不能真正帮助你解决ror的问题,但是对于这个好问题点赞 - 很明显你已经尝试并做了功课。 - Kobi
谢谢,是的,我一直在搜索关于UTF-8和Ruby 1.8/1.9的优秀文章,但没有找到与这个问题相关的内容。 - Hartator
就你的测试而言,它在1.8.7中可以运行 - 不确定这对你是否可行。 - smathy
我把你的代码复制粘贴到IRB和Rails控制台中,它们返回了“nil”。我相信这是正确的,但我不确定Regex如何处理中文字符。您是否尝试在正则表达式上使用“u”运算符?字符串[/\A[\w]*\z/u] - samullen
是的,我已经尝试过 /u 操作符了,没有改变任何东西。 - Hartator
1个回答

8

好的,我找到了解决我的问题的答案。在Ruby 1.9中,\w仅适用于ascii字符,而在Ruby 1.8中适用于所有unicode字符。现在,在Ruby 1.9中,我们必须使用:[\w\P{ASCII}]

更多信息:http://www.ruby-forum.com/topic/210770


2
多么美妙的静默和难以检测的故障 :) - Sebastian

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