Qual è il modo più semplice per la traslitterazione di caratteri non inglesi in ruby. Quella è la conversione come ad esempio:Traslitterazione in rubino
translit "Gévry"
#=> "Gevry"
Qual è il modo più semplice per la traslitterazione di caratteri non inglesi in ruby. Quella è la conversione come ad esempio:Traslitterazione in rubino
translit "Gévry"
#=> "Gevry"
Ruby ha una libreria Iconv nella sua stdlib che converte codifiche in modo molto simile al consueto iconv
comando
provare a prendere uno sguardo a this script da TechniConseils che sostituisce i caratteri accentati in una stringa. Esempio di utilizzo:
"Gévry".removeaccents #=> Gevry
Non funziona con le stringhe UTF-8, almeno per me. – lzap
Utilizzare i UnicodeUtils gioiello. Funziona in 1.9 e 2.0. Iconv è stato deprecato in queste versioni.
gem install unicode_utils
Quindi provare questo 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 è necessario normalizzare la stringa nel formato NFKD (Decomposizione ompatibilità modulo di normalizzazione). La "e" codepoint unicode, noto come "latin small letter e with acute", può essere rappresentato in due modi:
Con il primo modulo il più popolare come singolo punto di codice. La seconda forma è il formato scomposto, che separa il grapheme (ciò che appare come "é" sullo schermo) nei suoi due punti di codice base, ASCII "e" e il segno di accento acuto. Unicode può comporre un grafema da molti punti di codice, che è utile in alcuni sistemi di scrittura asiatici.
Nota: in genere si desidera normalizzare i dati in un formato standard per il confronto, l'ordinamento, ecc. In ruby i due formati di "é" 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 un o più "segni" diacritici. Catturando la lettera corrispondente, possiamo usare gsub per sostituire la lettera + segni diacritici dalla lettera catturata in tutta la stringa.
Questa tecnica ha rimosso i segni diacritici dalle lettere ASCII e non convertirà i set di caratteri come le stringhe greche o cirilliche in lettere ASCII equivalenti.
+1 per il modo ingegnoso di separare gli accenti di lettere e quindi rimuoverli. -1 per non normalizzare 'ı' come 'i' – nurettin
Questo sembra essere un duplicato esatto della mia precedente domanda: http://stackoverflow.com/questions/225471/how-do-i-replace-accented-latin-characters-in-ruby –