Используйте камень 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)). Кодовая точка Unicode «é», известная как « латинская строчная буква e с острым », может быть представлена двумя способами:
- é = U + 00E9
- é = (e = U + 0065) + (острый = U + 0301)
Первая форма наиболее популярна как единая кодовая точка. Вторая форма - это декомпозированный формат, разделяющий графему (то, что на вашем экране отображается как «é») на две базовые кодовые точки: ASCII «e» и знак острого акцента. Unicode может составлять графемы из множества кодов, что полезно в некоторых азиатских системах письма.
Обратите внимание, что вы обычно хотите нормализовать ваши данные в стандартном формате для сравнения, сортировки и т. Д. В ruby два формата "é" здесь НЕ равны (). В 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.