Вопрос по utf-8, ruby-on-rails, internationalization – Рубиновый метод для удаления акцентов с международных символов UTF-8

57

Я пытаюсь создатьнормализуется» копия строки, чтобы помочь уменьшить дубликаты имен в базе данных. Имена содержат много международных символов (т. Е. Ударных букв), и я хочу создать копию с удаленными акцентами.

Я сталкивался с методом ниже, но не могу заставить его работать. Я могу'Похоже, что плагин Unicode Hacks не находит.

  # Utility method that retursn an ASCIIfied, downcased, and sanitized string.
  # It relies on the Unicode Hacks plugin by means of String#chars. We assume
  # $KCODE is 'u' in environment.rb. By now we support a wide range of latin
  # accented letters, based on the Unicode Character Palette bundled inMacs.
  def self.normalize(str)
     n = str.chars.downcase.strip.to_s
     n.gsub!(/[à áâãäåÄÄ?]/u,    'a')
     n.gsub!(/æ/u,                  'ae')
     n.gsub!(/[ÄÄ?]/u,                'd')
     n.gsub!(/[çÄ?ÄÄ?Ä?]/u,          'c')
     n.gsub!(/[èéêëÄ?Ä?Ä?Ä?Ä?]/u, 'e')
     n.gsub!(/Æ?/u,                   'f')
     n.gsub!(/[ÄÄ?Ä¡Ä£]/u,            'g')
     n.gsub!(/[ĥħ]/,                'h')
     n.gsub!(/[ììíîïīĩĭ]/u,     'i')
     n.gsub!(/[įıijĵ]/u,           'j')
     n.gsub!(/[ķĸ]/u,               'k')
     n.gsub!(/[Å?ľĺļÅ?]/u,         'l')
     n.gsub!(/[ñÅ?Å?Å?Å?Å?]/u,       'n')
     n.gsub!(/[òóôõöøÅÅ?ÅÅ]/u,  'o')
     n.gsub!(/Å?/u,                  'oe')
     n.gsub!(/Ä?/u,                   'q')
     n.gsub!(/[Å?Å?Å?]/u,             'r')
     n.gsub!(/[Å?Å¡Å?ÅÈ?]/u,          's')
     n.gsub!(/[ťţŧÈ?]/u,           't')
     n.gsub!(/[ùúûüūůűŭũų]/u,'u')
     n.gsub!(/ŵ/u,                   'w')
     n.gsub!(/[ýÿŷ]/u,             'y')
     n.gsub!(/[žżź]/u,             'z')
     n.gsub!(/\s+/,                   ' ')
     n.gsub!(/[^\sa-z0-9_-]/,          '')
     n
  end

Нужно ли мне 'требуют» конкретная библиотека / драгоценный камень? Или, может быть, кто-то может порекомендовать другой способ пойти по этому поводу.

Я не использую Rails и не планирую этого делать.

использую Ruby 1.9.3, яЯ посмотрю на оба эти возможных решения, все, что мне нужно, это вышеупомянутый методs замена перечисленных символов, так что если эти решения могут сделать это здорово, и спасибо :) Gus Shortz
Какую версию ruby вы используете? Huluk
Я наконец нашел некоторые ссылки на плагин Unicode Hack (railslodge.com/plugins/316-unicode-hacks), что обеспечиваетchars метод, необходимый дляnormalize метод, который я упомянул. Но, похоже, больше не поддерживается Gus Shortz
Взгляни наstackoverflow.com/questions/1268289/... MurifoX
Вы также можете посмотреть на:github.com/norman/unidecoderI» amalrik maia

Ваш Ответ

3   ответа
6

параметризировать Метод может быть хорошим и простым решением для удаления специальных символов, чтобы использовать строку как читабельный идентификатор:

> "Françoise Isaïe".
180

Я обычно использую I18n для обработки этого:

1.9.3p392 :001 > require "i18n"
 => true
1.9.3p392 :002 > I18n.transliterate("Hé les mecs!")
 => "He les mecs!"
Спасибо! работал на меня! William Weckl
Кажется, это то, что яищу Благодарю. Gus Shortz
Примечание: это работает не для всех. Пример "Bùя Viện " переводится на "Bui Vi? N " CHawk
Прямо под моим носом. Спасибо! Trip
9

Пока что единственный способ, которым яя смог выполнить то, что мне нужно:

str.tr(
"ÀÁÂÃÄÅàáâãäåĀāĂ㥹ÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňʼnŊŋÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšſŢţŤťŦŧÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž",
"AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSssTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz")

Но используя это чувствует себя оченьхак»и я хотел бы найти лучший путь.

Этот работает для UTF-8 и ruby 2.2.3, и делает именно то, что мне нужно. Не хватает некоторых румынских символов, хотя. Я'добавили их:string.tr( "ÀÁÂÃÄÅàáâãäåĀāĂ㥹ÇçĆćĈĉĊċČčÐðĎďĐđÈÉÊËèéêëĒēĔĕĖėĘęĚěĜĝĞğĠġĢģĤĥĦħÌÍÎÏìíîïĨĩĪīĬĭĮįİıĴĵĶķĸĹĺĻļĽľĿŀŁłÑñŃńŅņŇňʼnŊŋÒÓÔÕÖØòóôõöøŌōŎŏŐőŔŕŖŗŘřŚśŜŝŞşŠšȘșſŢţŤťŦŧȚțÙÚÛÜùúûüŨũŪūŬŭŮůŰűŲųŴŵÝýÿŶŷŸŹźŻżŽž", "AAAAAAaaaaaaAaAaAaCcCcCcCcCcDdDdDdEEEEeeeeEeEeEeEeEeGgGgGgGgHhHhIIIIiiiiIiIiIiIiIiJjKkkLlLlLlLlLlNnNnNnNnnNnOOOOOOooooooOoOoOoRrRrRrSsSsSsSsSssTtTtTtTtUUUUuuuuUuUuUuUuUuUuWwYyyYyYZzZzZz") Alexander
Это работает только для ISO-8859-1. Что заставляет вас думать, что это работает для UTF-8? pts

Похожие вопросы