Получение уникальных значений из массива со словами, содержащими диакритические знаки в Ruby - PullRequest
0 голосов
/ 03 декабря 2018

Как я могу получить uniq значения из массива, исключая наличие тех же слов без надлежащих диакритических знаков?

Прямо сейчас это работает так:

["Poznan", "Poznań", "Gdańsk"].uniq 
=> ["Poznan", "Poznań", "Gdańsk"]

Ивот чего я хочу достичь:

["Poznan", "Poznań", "Gdańsk"].uniq 
=> ["Poznań", "Gdańsk"]

Ответы [ 2 ]

0 голосов
/ 03 декабря 2018

Как насчет использования I18n.transliterate : Transliterates UTF-8 символов до ASCII.По умолчанию этот метод транслитерирует только латинские строки в ASCII-аппроксимацию:

> require "i18n"
> I18n.config.available_locales = :en
> ["Poznan", "Poznań", "Gdańsk"].map{|e| I18n.transliterate(e)}.uniq
#=> ["Poznan", "Gdansk"] 
0 голосов
/ 03 декабря 2018

Вы можете нормализовать форму Unicode к NFKD, чтобы отделить ударение от нижележащих символов, а затем удалить акценты.Это преобразовало бы 'Poznań' в 'Poznan', оставив 'Poznan' в покое.Затем используйте блочную форму Array#uniq:

array = %w[Poznan Poznań Gdańsk]
array.uniq { |s| s.unicode_normalize(:nfkd).gsub(/[^\p{L}\p{N}]/, '') }
# ["Poznan", "Gdańsk"] 

Обратите внимание, что вместо Poznań выбран Poznan.Если у вас есть предпочтение одной форме слова перед другой, вы можете использовать нормализацию и удаление акцента, чтобы сравнить слова и реализовать свою собственную версию uniq, которая определяет приоритетность предпочитаемой вами формы.

...