Correction de l’encodage du fichier texte codé de manière incohérente

J’ai un long fichier texte qui utilise des codages apparemment différents dans les blocs de texte suivants (iso ou utf-8). C’est le résultat de l’ajout de texte en utilisant >> file.bib et de copier et coller à partir de différentes sources (pages Web).

Les blocs peuvent en principe être distingués car ce sont des entrées bibtex

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

Je voudrais le convertir en un fichier cohérent utf-8 car il semble planter mon visualiseur bibtex (kbibtex). Je sais que je peux utiliser iconv pour convertir l’encodage de fichiers entiers, mais j’aimerais savoir s’il existe un moyen de réparer mon fichier sans corrompre certaines entrées.

Si vous pouvez assumer un codage uniforme pour chaque ligne ET vous connaissez le codage alternatif:

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

Vous pouvez toujours faire la même chose avec des mots si les lignes sont mixtes, mais vous savez toujours quel est le codage alternatif. Si vous ne connaissez pas le codage alternatif, ou si vous en avez plus d’un, vous devez utiliser une bibliothèque de devinettes, ce qui peut s’avérer erroné.

J’utilise vim pour cela, mais je suppose que cela peut être fait dans n’importe quel éditeur.

  • Sélectionnez (décalage + v) un bloc de texte sur lequel vous souhaitez modifier l’encodage.

  • type:! enca -L lang – (remplacez ‘lang’ par votre langue, j’utilise ‘enca -L cs’. L’utilitaire enca devrait alors vous indiquer le codage le plus probable du bloc sélectionné)

  • appuyez sur u (afin de défaire la réponse de enca apparaissant dans votre texte)

  • sélectionnez à nouveau le bloc, cette fois-ci en cours d’exécution:! iconv -f determination_encoding -t UTF-8

Notez que vim se développe automatiquement en pressant: sur: \ <,> lorsque vous êtes en mode visuel, ce qui est exactement ce que vous voulez pour exécuter des programmes sur des blocs de texte.