2009-11-13 11 views
10

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

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

+0

Esto parece ser un duplicado exacto de mi pregunta anterior: http://stackoverflow.com/questions/225471/how-do-i-replace-accented-latin-characters-in-ruby –

Respuesta

10

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

+1

Sí ... 'Iconv .iconv ('ascii // ignore // translit', 'utf-8', cadena) .to_s' hace el trabajo. – Selva

+1

Acabo de probar esto en el ejemplo del OP, y me devolvió "Gvry", no "Gevry". – jrdioko

+2

@jrdioko Debería ser 'Iconv.iconv ('ascii // translit // ignore', 'utf-8', cadena)' – steenslag

3

trate de tomar un vistazo a this script de TechniConseils que reemplaza los caracteres acentuados en una cadena. Ejemplo de uso:

"Gévry".removeaccents #=> Gevry 
+0

No funciona con cadenas UTF-8, al menos para mí. – lzap

6

Utilice las UnicodeUtils joya. Esto funciona en 1.9 y 2.0. Iconv ha quedado obsoleto en estas versiones.

gem install unicode_utils 

A continuación, intente 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 tiene que normalizar la cadena en formato NFKD (Forma de normalización (K) descomponibilidad incompatibilidad). El punto de código Unicode "E", conocido como "latin small letter e with acute", se puede representar en dos formas:

  • E = U + 00E9
  • E = (e = U + 0065) + (aguda = U + 0301)

Con el primer formulario siendo el 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.

Nota, por lo general, 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, hacer 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 usando el "nombre de la propiedad" sintaxis (\ p {nombre_propiedad}) 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.

+0

+1 por la ingeniosa forma de separar acentos de letras y luego eliminarlas. -1 por no normalizar 'ı' como 'i' – nurettin