Как заменить акцентированные латинские символы в Ruby?



у меня есть ActiveRecord модель Foo, которая имеет

806   15  

15 ответов:

Rails уже имеет встроенный для нормализации, вам просто нужно использовать это, чтобы нормализовать вашу строку для формирования KD, а затем удалить другие символы (т. е. знаки акцента) следующим образом:

>> "àáâãäå".mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,'').downcase.to_s
=> "aaaaaa"

ActiveSupport::Inflector.transliterate (требуется рельсы 2.2.1+ и Ruby 1.9 или 1.8.7)

пример:

>> ActiveSupport::Inflector.transliterate("àáâãäå").to_s => "aaaaaa"

еще лучше использовать I18n:

1.9.3-p392 :001 > require "i18n"
 => false
1.9.3-p392 :002 > I18n.transliterate("Olá Mundo!")
 => "Ola Mundo!"

Я пробовал много таких подходов, но они не достигали одного или нескольких из этих требований:

  • уважение пространства
  • уважение '-' символ
  • Respect case (я знаю, что это не требование для исходного вопроса, но не сложно переместить строку в lowcase)

было так:

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

http://blog.slashpoundbang.com/post/12938588984/remove-all-accents-and-diacritics-from-string-in-ruby

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

мой ответ: строка#parameterize способ:

"Le cœur de la crémiére".parameterize
=> "le-coeur-de-la-cremiere"

для не-рельсовых программ:

установить activesupport: gem install activesupport затем:

require 'active_support/inflector'
"a&]'s--34\xC2àáâã3D".parameterize
# => "a-s-3-3d"

Я думаю, что вы, возможно, не совсем то, что пойти по этому пути. Если вы разрабатываете для рынка, который имеет такие письма, ваши пользователи, вероятно, подумают, что вы своего рода ...pip. Потому что " å "даже не близко к" a " в любом смысле для пользователя. Возьмите другую дорогу и прочитайте о поиске не-ascii-способом. Это всего лишь один из тех случаев, когда кто-то придумал unicode и сортировка.

очень поздно PS:

http://www.w3.org/International/wiki/Case_folding http://www.w3.org/TR/charmod-norm/#sec-WhyNormalization

кроме того, у меня нет способа ide ссылка на параметры сортировки перейти на страницу msdn, но я оставляю его там. Это должно было быть http://www.unicode.org/reports/tr10/

разложить строку и удалить несамостоятельные знаки от него.

irb -ractive_support/all
> "àáâãäå".mb_chars.normalize(:kd).gsub(/\p{Mn}/, '')
aaaaaa

Вам также может понадобиться это, если используется в a .rb файл.

# coding: utf-8

the normalize(:kd) часть здесь разбивает диакритические знаки, где это возможно (например:" n с Тильдой " один символ разбивается на n с последующим объединением диакритического символа Тильды), и gsub часть затем удаляет все диакритические символы.

Это предполагает, что вы используете рельсы.

"anything".parameterize.underscore.humanize.downcase

учитывая ваши требования, это, вероятно, то, что я бы сделал... Я думаю, что это аккуратно, просто и будет оставаться в курсе будущих версий Rails и Ruby.

обновление: dgilperez указал, что parameterize принимает аргумент разделителя, поэтому "anything".parameterize(" ") (рекомендуется) или "anything".parameterize(separator: " ") короче и чище.

преобразуйте текст в форму нормализации D, удалите все кодовые точки с помощью unicode category non spacing mark (Mn) и преобразуйте его обратно в форму нормализации C. Это удалит все диакритические знаки, и ваша проблема сводится к поиску без учета регистра.

см.http://www.siao2.com/2005/02/19/376617.aspx и http://www.siao2.com/2007/05/14/2629747.aspx для деталей.

ключ должен использовать два столбца в вашей базе данных: canonical_text и original_text. Используйте original_text для отображения и canonical_text для поисков. Таким образом, если пользователь ищет "Visual Cafe", он видит результат "Visual Café". Если она действительно хочет другой элемент под названием "Visual Cafe", он может быть сохранен отдельно.

чтобы получить символы canonical_text в исходном файле Ruby 1.8, сделайте что-то вроде этого:

register_replacement([0x008A].pack('U'), 'S')

вы, вероятно, хотите декомпозицию Unicode ("NFD"). После разложения строки просто отфильтруйте все, что не находится в [A-Za-z]. æ разложится на" ae", ã на" A~ " (приблизительно - диакритический станет отдельным символом), поэтому фильтрация оставляет разумное приближение.

iconv:

http://groups.google.com/group/ruby-talk-google/browse_frm/thread/8064dcac15d688ce?

=============

модуль perl, который я не могу понять:

http://www.ahinea.com/en/tech/accented-translate.html

============

грубая сила (есть много htose твари!:

http://projects.jkraemer.net/acts_as_ferret/wiki#UTF-8support

http://snippets.dzone.com/posts/show/2384

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

У меня были проблемы с получением Foo.mb_chars.normalize(:kd).gsub(/[^\x00-\x7F]/n,").downcase.to_s решение для работы. Я не использую Rails, и был некоторый конфликт с моими версиями activesupport/ruby, из которых я не мог добраться до дна.

использование ruby-unf gem кажется хорошей заменой:

require 'unf'
foo.to_nfd.gsub(/[^\x00-\x7F]/n,'').downcase

насколько я могу судить, это делает то же самое .mb_chars.нормализовать (кд). Это правильно? Спасибо!

lol.. я просто попробовал это.. и это работает.. я все еще не уверен, почему.. но когда я использую эти 4 строки кода:

  • str = str.gsub (/[^a-zA-Z0-9 ]/,"")
  • str = str.gsub(/[ ]+/," ")
  • str = str.gsub(/ /,"-")
  • str = str.downcase

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

Comments

    Ничего не найдено.