La traslitterazione in Ruby
-
19-09-2019 - |
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"
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