2010-01-25 48 views
13

我試圖將我的一些舊rails應用程序移植到Ruby 1.9,並且不斷收到關於「Ruby 1.9不支持Unicode規範化」的警告。我跟蹤它到這個功能,但我發現每次請求約20警告消息:Ruby 1.9不支持Unicode規範化

軌-2.3.5 /的ActiveSupport/lib中/ active_support/inflector.rb

def transliterate(string) 
    warn "Ruby 1.9 doesn't support Unicode normalization yet" 
    string.dup 
end 

任何想法我應該如何開始追蹤並解決它?

回答

9

如果你知道後果,即重音字符不會在1.9.1 + Rails的2.3.x版本譯音,把這個在配置初始化沉默警告:

# http://stackoverflow.com/questions/2135247/ruby-1-9-doesnt-support-unicode-normalization-yet 
module ActiveSupport 
    module Inflector 
    # Calling String#parameterize prints a warning under Ruby 1.9, 
    # even if the data in the string doesn't need transliterating. 
    if Rails.version =~ /^2\.3/ 
     undef_method :transliterate 
     def transliterate(string) 
     string.dup 
     end 
    end 
    end 
end 

Rails 3中確實解決了這個問題,所以更面向未來的解決方案將是實現這一遷移。

2

該方法定義包裝在Ruby 1.9的if語句中。在它的上面,你會發現正常的定義,它顯示了更多的這是做什麼。這是一種用於將重音字符轉換爲常規變體的方法。例如: - á =>a,或ë =>e

但是這種方法僅在參數化,這是在向右轉以上音譯定義使用。這一切仍然在ActiveSupport中。我找不到任何直接調用參數化的東西。

因此,也許你正在使用參數化或音譯自己,在你的Rails應用程序的某個地方?

(根據參數化文檔)

常見的用法是用於創建從任意字符串友好永久鏈接,很像SO確實,例如:

http://stackoverflow.com/questions/2135247/ruby-1-9-doesnt-support-unicode-normalization-yet 
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ 
2

更換方法的主體與

raise "transliterate called" 

,然後觀察一次回溯,它會告訴你第一次通話來自何處。你的應用程序當然會崩潰,但這可能會讓你第一次嘗試的罪魁禍首。

1

我明白,這是一個骯髒的方式來解決問題,但已閱讀錯誤消息,我知道這個問題。所以我想擺脫警告。我在environment.rb中下跌了代碼:/

module ActiveSupport 
    module Inflector 
    # Calling String#parameterize prints a warning under Ruby 1.9, 
    # even if the data in the string doesn't need transliterating. 
    # Maybe Rails 3 will have fixed it...? 
    if RAILS_GEM_VERSION =~ /^2\.3/ 
     undef_method :transliterate 
     def transliterate(string) 
     string.dup 
     end 
    end 
    end 
end 
1

如果你不想猴子修補Inflector模塊,你也可以做到這一點...

以下兩種工作對我來說沉默這惱人的「紅寶石1.9不支持Unicode正常化尚未」警告:

silence_stream(STDERR) { 
    whatever_code_caused_transliterate_to_be_called 
} 

silence_warnings { 
    whatever_code_caused_transliterate_to_be_called 
} 

這確實有它需要弄亂你的調用代碼的缺點,但它是一種技術只要不想看到警告或其他輸出,就可以使用。

activesupport提供silence_streamsilence_warningsactivesupport-2.3.11/lib/active_support/core_ext/kernel/reporting.rb

+0

我認爲,「雜亂」值得它能夠對特定情況下的警告進行沉默,並且讓其他讀者明白它們已被消除。 – 2013-09-26 12:50:55

4

StringEx Gem似乎工作得很好。它也不依賴於Iconv。

它增加了一些方法,String類,像這確實漂亮音譯開箱即用「to_ascii」:

require 'stringex' 
"äöüÄÖÜßë".to_ascii #=> "aouAOUsse" 

此外,Babosa Gem做了偉大的工作,音譯UTF-8字符串,即使語言支持:

"Jürgen Müller".to_slug.transliterate.to_s   #=> "Jurgen Muller" 
"Jürgen Müller".to_slug.transliterate(:german).to_s #=> "Juergen Mueller" 

享受。

0

String#unicode_normalizeString#unicode_normalize!,String#unicode_normalized?將在Ruby 2.2中引入。示例代碼和實現可以在test case,lib/unicode_normalize.rblib/unicode_normalize/normalize.rb中看到。

// U+00E1: LATIN SMALL LETTER A WITH ACUTE 
// U+U+0301: COMBINING ACUTE ACCENT 

puts "\u00E1" == "a\u0301".unicode_normalize(:nfc) 
puts true == "a".unicode_normalized?(:nfc)