ruby transliteration

ruby - Transliteración en rubí



transliteration (3)

¿Cuál es la forma más sencilla para la transliteración de caracteres no ingleses en rubí? Esa es una conversión como:

translit "Gévry"
#=> "Gevry"


Intente echar un vistazo a esta secuencia de comandos de TechniConseils que reemplaza los caracteres acentuados en una cadena. Ejemplo de uso:

"Gévry".removeaccents #=> Gevry


Ruby tiene una biblioteca Iconv en su stdlib que convierte las codificaciones de una manera muy similar al comando usual iconv


Usa la gema UnicodeUtils . Esto funciona en 1.9 y 2.0. Iconv ha quedado obsoleto en estas versiones.

gem install unicode_utils

Entonces prueba esto en 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"

¡Ahora una explicación de cómo funciona esto!

Primero, debe normalizar la cadena en formato NFKD ( Descomposición de compatibilidad de forma de normalización (K)). El punto de código unicode "é", conocido como " letra pequeña latina e con aguda ", se puede representar de dos maneras:

  • é = U + 00E9
  • é = (e = U + 0065) + (agudo = U + 0301)

Con la primera forma es la más popular como punto de código único. La segunda forma es el formato descompuesto, que separa el grafema (lo que aparece como "é" en la pantalla) en sus dos puntos de código base, la "e" ASCII y la marca aguda de acento. Unicode puede componer un grafema a partir de muchos puntos de código, lo cual es útil en algunos sistemas de escritura asiáticos.

Tenga en cuenta que normalmente desea normalizar sus datos en un formato estándar para comparación, clasificación, etc. En ruby, los dos formatos de "é" aquí NO son iguales (). En IRB, haz esto:

> "/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"

Ahora que tenemos la cadena en formato NFKD, podemos aplicar una expresión regular utilizando la sintaxis de "nombre de propiedad" (/ p {property_name}) para que coincida con una letra seguida de una o más "marcas" diacríticas. Al capturar la letra correspondiente, podemos usar gsub para reemplazar la letra + signos diacríticos por la letra capturada a lo largo de la cadena.

Esta técnica eliminó las marcas diacríticas de las letras ASCII y no transliterará conjuntos de caracteres como cadenas griegas o cirílicas en letras ASCII equivalentes.