2012-05-21 11 views
5

Ho un lungo file di testo che utilizza codifiche apparentemente diverse in successivi blocchi di testo (iso o utf-8). È il risultato dell'aggiunta di testo utilizzando >> file.bib e copia e incolla da diverse fonti (pagine Web).Correzione fissa del file di testo incoerentemente codificato

I blocchi possono in linea di principio essere distinte in quanto sono bibtex voci

@article{key, author={lastname, firstname}, ...} 

vorrei convertirlo in un file coerente utf-8 dal momento che sembra mandare in crash il mio spettatore bibtex (kbibtex). So che posso usare iconv per convertire la codifica di interi file, ma vorrei sapere se c'è un modo per correggere il mio file senza corrompere alcune delle voci.

+4

Fornire ulteriori dettagli, vedere [Domande sulla conversione di un file con codifica mista su UTF8 in Perl] (http://stackoverflow.com/questions/6897982/questions-about-converting-a-mixed-encoding-file- to-utf8-in-perl) per un confronto quali informazioni sono utili. – daxim

+0

Si dovrebbe iniziare dividendo il file nei singoli documenti HTML. Quindi puoi controllare ciascun documento per una distinta base e per un set di caratteri nell'elemento HEAD. – ikegami

risposta

3

Se si può assumere la codifica uniforme per ogni linea e si conosce la codifica alternativo:

#!/usr/bin/perl 
use Encode; 
while(<>) { 
     my $line; 
     eval { 
     $line=Encode::decode_utf8($_); 
     } 
     if ([email protected]) $line=Encode::decode('iso-8859-1', $_); #not UTF-8 
     # Now $line is UNICODE.Do something to it 

} 

È ancora possibile fare lo stesso con le parole se le linee sono codifica misti, ma si sa ancora che cosa è il supplente codifica. Se non conosci la codifica alternativa, o se ne hai più di una, devi usare una libreria di indovinare la codifica, che potrebbe indovinare.

+2

È tra UTF-8 e iso-8859-1, usa invece lo strumento 'fix_latin' che viene fornito con [Encoding :: FixLatin] (http://search.cpan.org/perldoc?Encoding::FixLatin) del codice di Alien Life Form. – ikegami

3

Io uso vim per questo, ma suppongo che possa essere fatto in qualsiasi editor.

  • Select (shift + v) un blocco di testo che si desidera modificare la codifica su.

  • Tipo: ENCA -L lang - (sostituire 'lang' con la vostra lingua, io uso 'ENCA -L cs' utilità ENCA dovrebbe poi dire la più probabile codifica del blocco selezionato.)

  • !

    premere u (in modo da annullare la risposta di ENCA che è apparso nel testo)

  • selezionare nuovamente il blocco, questo durata: iconv -f -t determined_encoding UTF-8

si noti che vim si espande automaticamente premuto: a: \ <,> quando sei in modalità visuale, che è esattamente ciò che vuoi per l'esecuzione di programmi su blocchi di testo.