Ruby 1.9 пока не поддерживает нормализацию Unicode - PullRequest
13 голосов
/ 25 января 2010

Я пытаюсь перенести некоторые из моих старых rails-приложений на Ruby 1.9 и получаю предупреждения о том, что "Ruby 1.9 пока не поддерживает нормализацию Unicode" Я отследил это до этой функции, но я получаю около 20 предупреждающих сообщений за запрос:

Рельсы-2.3.5 / ActiveSupport / Библиотека / active_support / inflector.rb

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

Какие-нибудь идеи, как мне начать отслеживать и разрешать их?

Ответы [ 7 ]

9 голосов
/ 01 мая 2010

Если вы знаете о последствиях, то есть акцентированные символы не будут транслитерированы в Ruby 1.9.1 + Rails 2.3.x, поместите это в config / initializers, чтобы отключить предупреждение:

# /1723965/ruby-1-9-poka-ne-podderzhivaet-normalizatsiy-unicode
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 действительно решает эту проблему, поэтому более перспективным решением было бы перейти к этому.

4 голосов
/ 20 октября 2011

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"

Наслаждайтесь.

2 голосов
/ 28 января 2010

Заменить тело метода на

raise "transliterate called"

и наблюдайте обратную трассировку, которая покажет вам, откуда поступает материал при первом вызове. Ваше приложение, конечно, тоже рухнет, но это, вероятно, даст вам виновника с первой попытки.

2 голосов
/ 26 января 2010

Это определение метода заключено в оператор if для Ruby 1.9. Прямо над ним вы найдете обычное определение, которое показывает немного больше о том, что это делает. Это метод, используемый для преобразования акцентированных символов в их обычные варианты. Например: á => a или ë => e

Но этот метод используется только в параметризации, которая, в свою очередь, определяется прямо над транслитерацией. Это все еще в ActiveSupport. Я не могу найти ничего, что напрямую вызывает параметризацию.

Так, возможно, вы сами используете параметризацию или транслитерацию, где-нибудь в своем приложении Rails?

Обычное использование (согласно документации по параметризации) для создания дружественных постоянных ссылок из произвольных строк, так же, как это делает SO, например:

/1723965/ruby-1-9-poka-ne-podderzhivaet-normalizatsiy-unicode
                                           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1 голос
/ 27 мая 2011

Если вы не хотите, чтобы обезьяна исправляла модуль Inflector, вы также можете сделать это ...

Оба этих действия помогли мне замолчать эту надоедливую "Ruby 1.9 не поддерживает Unicodeнормализация еще "предупреждение:

silence_stream(STDERR) {
  whatever_code_caused_transliterate_to_be_called
}

или

silence_warnings {
  whatever_code_caused_transliterate_to_be_called
}

Это имеет тот недостаток, что требует загромождать ваш код вызова, но это метод, который вы можете использовать обычно, когда вы нене хотите видеть предупреждения или другой вывод.

activesupport обеспечивает silence_stream и silence_warnings в activesupport-2.3.11/lib/active_support/core_ext/kernel/reporting.rb

1 голос
/ 27 февраля 2010

Я ценю, что это грязный способ решения проблемы, но, прочитав сообщение об ошибке, я знаю о проблеме. Поэтому я хочу избавиться от предупреждений. Я сбросил этот код в 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
0 голосов
/ 01 декабря 2014

String # unicode_normalize , String # unicode_normalize! , String # unicode_normalized? будет введено в Ruby 2.2.Пример кода и реализацию можно увидеть в тестовом примере , 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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...