2011-05-23 41 views
9

當我使用非標準的utf-8字符時,我的驗證正則表達式有問題。所以,我運行了一些實驗,看來ruby正則表達式在使用rails環境或普通ruby時表現不同。utf8字符串中的ruby正則表達式的奇怪行爲

我在這裏發佈我的expriment中文字符串。

在紅寶石 「純」:

string = "運動會" 
puts string[/\A[\w]*\z/] 
=> match "運動會" - ok 

在軌:

# 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)

所以我的結論是,軌改變了正則表達式的行爲方式,我沒有找到一種方式,使其行爲像在正常的紅寶石。

+1

不能真正與ROR幫助,但+1一個很好的問題 - 很明顯,你已經嘗試和做功課。 – Kobi 2011-05-23 11:03:53

+0

謝謝,是的,我繼續搜索發現有關utf-8和ruby 1.8/1.9的優秀文章,但沒有涉及到這個問題。 – Hartator 2011-05-23 12:27:39

+0

FWIW - 您的測試在1.8.7中工作 - 不確定這是否適合您。 – smathy 2011-05-23 16:18:35

回答

7

好吧,我找到了我的問題的答案。 \w的行爲只有在Ruby 1.9中用ascii字符對付ruby 1.8中的所有unicode caracter。在Ruby 1.9的,現在我們必須使用:[\w\P{ASCII}]

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

+1

多麼好的沉默,很難發現破損:) – Sebastian 2014-05-09 19:50:01