Domanda

Qual è il modo più semplice per la traslitterazione dei caratteri non inglesi in rubino. Che è la conversione come ad esempio:

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

È stato utile?

Soluzione

Ruby ha un Iconv biblioteca nella sua stdlib che converte codifiche in modo molto simile al consueto comando iconv

Altri suggerimenti

Utilizzare la UnicodeUtils gemma. Questo funziona in 1.9 e 2.0. Iconv è stato deprecato in queste release.

gem install unicode_utils

Quindi provare questo in 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"

Ora, una spiegazione di come funziona!

Per prima cosa devi per normalizzare la stringa nel NFKD (Modulo di normalizzazione (K) ompatability decomposizione) formato. La "e" codepoint unicode, noto come " alfabeto latino e con acuta ", può essere rappresentato in due modi:

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

Con la prima forma è il più popolare come un unico punto di codice. La seconda forma è il formato decomposto, separando il grafema (ciò che appare come "é" sullo schermo) nei suoi due punti di codice di base, l'ASCII "e" e l'accento acuto. Unicode può comporre un grafema da molti punti di codice, che è utile in alcuni sistemi di scrittura asiatici.

Si noti in genere si desidera per normalizzare i dati in un formato standard per il confronto, l'ordinamento, ecc rubino i due formati di "E" qui non sono uguali (). In IRB, fare questo:

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

Ora che abbiamo la stringa in formato NFKD, possiamo applicare un'espressione regolare utilizzando il "nome della proprietà" sintassi (\ p {} property_name) per abbinare una lettera seguita da uno o più diacritici "marchi". Catturando la lettera corrispondente, possiamo usare gsub per sostituire la lettera + segni diacritici dalla lettera catturato tutta la stringa.

Questa tecnica rimosso segni diacritici da lettere ASCII e non traslitterare i set di caratteri come gli archi greci o cirillici in caratteri ASCII equivalenti.

Prova dare un'occhiata a questo script da TechniConseils che sostituisce caratteri accentati in una stringa. Esempio di utilizzo:

"Gévry".removeaccents #=> Gevry
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top