Я пытаюсь выяснить "правильный" способ сортировки строк UTF-8 в Ruby on Rails.
В моем приложении у меня есть поле выбора, которое заполняется странами. Поскольку мое приложение локализовано, каждый существующий язык имеет файл country.yml, который связывает идентификатор страны с локализованным именем для этой страны. Я не могу сортировать строки вручную в файле yml, потому что мне нужно, чтобы ID был согласован во всех локалях.
Что я сделал, создайте метод ascii_name
, который использует unidecode
для преобразования акцентированных и нелатинских символов в свои ascii эквивалент (например, "Afeganistão" станет "Afeganistao" ), а затем сортировать по этому:
require 'unidecode'
class Country
def ascii_name
Unidecoder.decode(name).gsub("[?]", "").gsub(/`/, "'").strip
end
end
Country.all.sort_by(:&ascii_name)
Однако есть очевидные проблемы с этим:
- Невозможно правильно отсортировать нелатинские локали, так как не может быть прямого аналогичного латинского символа.
- Он не делает различия между буквой и всеми акцентированными формами этой буквы (так, например, A и Ä становятся взаимозаменяемыми)
Кто-нибудь знает, как лучше я могу сортировать строки?