2009-11-13 19 views
10

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"

+0

Questo sembra essere un duplicato esatto della mia precedente domanda: http://stackoverflow.com/questions/225471/how-do-i-replace-accented-latin-characters-in-ruby –

risposta

10

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

+1

Sì .. 'Iconv .iconv ('ascii // ignore // translit', 'utf-8', string) .to_s' fa il lavoro. – Selva

+1

Ho appena provato questo nell'esempio dell'OP e restituito "Gvry", non "Gevry". – jrdioko

+2

@jrdioko Dovrebbe essere 'Iconv.iconv ('ascii // translit // ignore', 'utf-8', string)' – steenslag

3

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 
+0

Non funziona con le stringhe UTF-8, almeno per me. – lzap

6

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:

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

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.

+0

+1 per il modo ingegnoso di separare gli accenti di lettere e quindi rimuoverli. -1 per non normalizzare 'ı' come 'i' – nurettin