2010-01-25 11 views
13

Sto provando a trasferire su Ruby 1.9 alcune delle mie vecchie applicazioni su rotaie e continuo a ricevere avvertimenti su come "Ruby 1.9 non supporta ancora la normalizzazione Unicode". Ho rintracciato giù a questa funzione, ma sto ottenendo circa 20 messaggi di avviso per richiesta:Ruby 1.9 non supporta ancora la normalizzazione Unicode

rotaie-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 

Tutte le idee come dovrei iniziare a rintracciarli e risolverlo?

risposta

9

Se siete a conoscenza delle conseguenze, caratteri accentati cioè non verranno traslitterati in Ruby 1.9.1 + Rails 2.3.x, collocare questo in config/inizializzatori al silenzio l'avvertimento:

# 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 effettivamente risolvere questo problema, quindi una soluzione più a prova di futuro sarebbe a migrare verso questo.

2

Questa definizione di metodo è racchiusa in un'istruzione if per Ruby 1.9. Subito sopra, troverai la definizione regolare, che mostra un po 'più di ciò che sta facendo. È un metodo utilizzato per convertire i caratteri accentati nelle loro varianti regolari. Es .: á =>a, o ë =>e

Ma questo metodo viene utilizzato solo in parametrizzare, che è a sua volta definito proprio sopra traslitterare. Questo è tutto ancora in ActiveSupport. Non riesco a trovare nulla che chiama direttamente la parametrizzazione.

Quindi forse stai usando la parametrizzazione o la traslitterazione da qualche parte nella tua applicazione Rails?

L'uso comune (in base alla documentazione parametrizzare) è per la creazione di permalink amichevoli da stringhe arbitrarie, proprio come lo fa, ad esempio:

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

Sostituire il corpo del metodo con

raise "transliterate called" 

e osserva un backtrace che ti mostrerà da dove arriva la roba alla prima chiamata. Ovviamente anche la tua app crollerà, ma questo probabilmente ti darà il colpevole sin dal primo tentativo.

1

Apprezzo che questo è un modo sporco per risolvere il problema, ma dopo aver letto il messaggio di errore sono a conoscenza del problema. Quindi voglio sbarazzarmi degli avvertimenti. Ho lasciato cadere questo codice in 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

Se si preferisce non scimmia applica una patch al modulo di Inflector, si può anche fare questo ...

entrambe le seguenti ha lavorato per me per mettere a tacere questo fastidioso "Ruby 1.9 non supporta la normalizzazione Unicode ancora" warning:

silence_stream(STDERR) { 
    whatever_code_caused_transliterate_to_be_called 
} 

o

silence_warnings { 
    whatever_code_caused_transliterate_to_be_called 
} 

Questo ha lo svantaggio che richiede ingombrano il vostro codice chiamante, ma è una tecnica è possibile utilizzare in genere ogni volta che non si desidera visualizzare avvisi o altro output.

activesupport fornisce silence_stream e silence_warnings in activesupport-2.3.11/lib/active_support/core_ext/kernel/reporting.rb

+0

Penso che il "disordine" valga la pena di essere in grado di silenziare gli avvisi solo per casi specifici e anche di rendere ovvio agli altri lettori che sono messi a tacere. –

4

La StringEx Gem sembra funzionare abbastanza bene. Non ha nemmeno dipendenza da Iconv.

Si aggiunge alcuni metodi per la classe String, come "to_ascii", che fa bella traslitterazione fuori dalla scatola:

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

Inoltre, il Babosa Gem fa un grande lavoro traslitterare stringhe UTF-8, anche con la lingua supporto:

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

Divertiti.

0

String # unicode_normalize, String # unicode_normalize!, String # unicode_normalized? sarà introdotto in Ruby 2.2. Il codice di esempio e l'implementazione possono essere visualizzati in test case, lib/unicode_normalize.rb e 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)