2010-01-25 17 views
13

मैं रूबी 1.9 में अपने कुछ पुराने रेल ऐप्स पर पोर्ट करने की कोशिश कर रहा हूं और मुझे चेतावनी मिल रही है कि "रूबी 1.9 यूनिकोड सामान्यीकरण का समर्थन क्यों नहीं करता है।" मैं इस समारोह के लिए इसे नीचे ट्रैक करने के बाद, लेकिन मैं अनुरोध के अनुसार लगभग 20 चेतावनी संदेश हो रही है:रूबी 1.9 यूनिकोड सामान्यीकरण का समर्थन नहीं करता है

रेल-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 + रेल 2.3.x लिप्यंतरित नहीं किया जाएगा, config में रखें/चुप्पी को initializers चेतावनी:

# 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 

रेल 3 वास्तव में इस समस्या को हल करता है, इसलिए एक और अधिक भविष्य सबूत समाधान की दिशा में स्थानांतरित करने के लिए किया जाएगा।

2

उस विधि परिभाषा को रूबी 1.9 के लिए if-statement में लपेटा गया है। इसके ठीक ऊपर, आपको नियमित परिभाषा मिल जाएगी, जो यह कर रही है कि इससे कुछ और दिखाता है। यह एक विधि है जो उच्चारण अक्षरों को उनके नियमित रूपों में परिवर्तित करने के लिए उपयोग की जाती है। उदा .: á =>a, या ë =>e

लेकिन इस विधि केवल parameterize, है जो बदले में सही अनुवाद कर ऊपर परिभाषित किया जाता है। यह सब अभी भी सक्रिय समर्थन में है। मुझे कुछ भी नहीं मिल रहा है जो सीधे पैरामीटर को कॉल कर रहा है।

तो शायद आप अपने रेल आवेदन में कहीं भी पैरामीटर या टाइपरीटेट का उपयोग कर रहे हैं?

आम उपयोग (parameterize प्रलेखन के अनुसार) मनमाने ढंग से तार से अनुकूल पर्मालिंक्स बनाने के लिए है, तो उदाहरण के लिए करता है बहुत पसंद,:

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 यूनिकोड सामान्य समर्थन नहीं करता है" चेतावनी:

silence_stream(STDERR) { 
    whatever_code_caused_transliterate_to_be_called 
} 

या

silence_warnings { 
    whatever_code_caused_transliterate_to_be_called 
} 

इस नुकसान यह है कि यह अपने बुला कोड को अव्यवस्थित करने की आवश्यकता है है, लेकिन यह एक तकनीक है जब भी आप चेतावनियां या अन्य आउटपुट देखना नहीं चाहते हैं तो आप आम तौर पर उपयोग कर सकते हैं।

activesupportactivesupport-2.3.11/lib/active_support/core_ext/kernel/reporting.rb

+0

मुझे लगता है कि "अव्यवस्था" केवल विशिष्ट मामलों के लिए चेतावनियों को चुप करने और अन्य पाठकों के लिए यह स्पष्ट करने के लिए योग्य है कि वे चुप हो गए हैं। –

4

में silence_stream और silence_warnings प्रदान करता है StringEx Gem बहुत अच्छी तरह से काम करने के लिए लगता है। यह Iconv पर कोई निर्भरता नहीं है।

यह "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

स्ट्रिंग # यूनिकोड_नोर्मलाइज, स्ट्रिंग # यूनिकोड_नोर्मलाइज!, स्ट्रिंग # unicode_normalized? रूबी 2.2 में पेश किया जाएगा। नमूना कोड और कार्यान्वयन test case, lib/unicode_normalize.rb और lib/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) 
संबंधित मुद्दे