Каков самый простой способ транслитерации неанглийских символов в рубине. Это преобразование, например:
translit "Gévry"
#=> "Gevry"
Каков самый простой способ транслитерации неанглийских символов в рубине. Это преобразование, например:
translit "Gévry"
#=> "Gevry"
Ruby имеет библиотеку Iconv в своем stdlib, которая преобразует кодировки очень похожим на обычную команду iconv
Используйте UnicodeUtils. Это работает в 1.9 и 2.0. Iconv устарел в этих версиях.
gem install unicode_utils
Затем попробуйте это в IRB:
2.0.0p0 :001 > require 'unicode_utils' #=> true
2.0.0p0 :002 > r = "Résumé" #=> "Résumé"
2.0.0p0 :003 > r.encoding #=> #<Encoding:UTF-8>
2.0.0p0 :004 > UnicodeUtils.nfkd(r).gsub(/(\p{Letter})\p{Mark}+/,'\\1')
#=> "Resume"
Теперь объяснение того, как это работает!
Сначала вам нужно нормализовать строку в формате NFKD (формат разложения (K) ompatability Decomposition). Кодовый номер "é" unicode, известный как " латинская маленькая буква e с острым, может быть представлен двумя способами:
С первой формой, наиболее популярной как единая кодовая точка. Вторая форма - это разложенный формат, отделяющий графем (что отображается как "é" на вашем экране) в две его базовые кодовые точки, ASCII "e" и острый знак акцента. Unicode может составлять графему из многих кодовых точек, что полезно в некоторых азиатских системах написания.
Примечание. Обычно вы хотите нормализовать свои данные в стандартном формате для сравнения, сортировки и т.д. В рубине два формата "é" здесь НЕ равны(). В IRB сделайте следующее:
> "\u00e9" #=> "é"
> "\u0065\u0301" #=> "é"
> "\u00e9" == "\u0065\u0301" #=> false
> "\u00e9" > "\u0065\u0301" #=> true
> "\u00e9" >= "f" #=> true (composed é > f)
> "\u0065\u0301" > "f" #=> false (decomposed é < f)
> "Résumé".chars.count #=> 6
> decomposed = UnicodeUtils.nfkd("Résumé")
#=> "Résumé"
> decomposed.chars.count #=> 8
> decomposed.length #=> 6
> decomposed.gsub(/(\p{Letter})\p{Mark}+/,'\\1')
#=> "Resume"
Теперь, когда у нас есть строка в формате NFKD, мы можем применить регулярное выражение, используя синтаксис "имя свойства" (\ p {property_name}), чтобы соответствовать букве, сопровождаемой одной или несколькими диакритическими "отметками". Захватив соответствующую букву, мы можем использовать gsub для замены буквы + диакритики захваченной буквой по всей строке.
Этот метод удаляет диакритические знаки из букв ASCII и не транслитерирует наборы символов, такие как греческие или кириллические строки, в эквивалентные буквы ASCII.
Попробуйте взглянуть на этот script из TechniConseils, который заменяет символы с акцентом в строке. Пример использования:
"Gévry".removeaccents #=> Gevry