Estoy tratando de encontrar una manera "adecuada" de ordenar cadenas UTF-8 en Ruby on Rails.Ordenando cadenas UTF-8 en RoR
En mi aplicación, tengo un cuadro de selección que se rellena con los países. Como mi aplicación está traducida, cada configuración regional existente tiene un archivo countries.yml que relaciona la identificación de un país con el nombre localizado de ese país. No puedo ordenar las cadenas manualmente en el archivo yml porque necesito que el ID sea coherente en todas las configuraciones regionales.
Lo que he hecho es crear un método ascii_name
que utiliza la gema unidecode
para convertir los caracteres acentuados y no latinos a su equivalente ASCII (por ejemplo, "Afeganistão" se convertiría en "Afeganistao"), y luego ordene que:
require 'unidecode'
class Country
def ascii_name
Unidecoder.decode(name).gsub("[?]", "").gsub(/`/, "'").strip
end
end
Country.all.sort_by(:&ascii_name)
sin embargo, existen problemas obvios con esto:
- Se puede no propiamente locales especie no latinos, ya que puede no ser un personaje latino análoga directa.
- No hace ninguna distinción entre una carta y todas las formas acentuadas de esa carta (así, por ejemplo, A y A se convierten en intercambiables)
¿Alguien sabe de una mejor manera que podía ordenar mis cuerdas?
¡Gracias, ese era exactamente el tipo de complemento que estaba buscando! –
Este complemento se basa en la descomposición de NFD http://en.wikipedia.org/wiki/Unicode_equivalence#Normal_forms y falla en algunos casos. No todos los caracteres diacríticos pueden descomponerse de esta manera (por ejemplo, la letra polaca Ł no puede). – skalee
@skalee ¿Tiene alguna sugerencia acerca de cómo clasificar correctamente las cadenas de texto utf-8 con caracteres polacos? – mdrozdziel