Я пытаюсь найти «правильный» способ сортировки строк UTF-8 в Ruby on Rails.
В моем приложении у меня есть поле выбора, заполненное странами. Поскольку мое приложение локализовано, в каждой существующей локали есть файл country.yml, который связывает идентификатор страны с локализованным именем этой страны. Я не могу отсортировать строки вручную в файле yml, потому что мне нужно, чтобы идентификатор был одинаковым во всех локалях.
Я создал метод 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 и Ä становятся взаимозаменяемыми)
Кто-нибудь знает, как лучше отсортировать мои строки?