Convertir l'encodage d'un fichier texte

15

Je rencontre fréquemment des fichiers texte (tels que des fichiers de sous-titres dans ma langue maternelle, le persan ) avec des problèmes d'encodage de caractères. Ces fichiers sont créés sur Windows et enregistrés avec un encodage inapproprié (semble être ANSI), qui semble charabia et illisible, comme ceci:

entrez la description de l'image ici

Dans Windows, on peut résoudre cela facilement en utilisant Notepad ++ pour convertir l'encodage en UTF-8, comme ci-dessous:

entrez la description de l'image ici

Et le résultat lisible correct est comme ceci:

entrez la description de l'image ici

J'ai beaucoup cherché une solution similaire sur GNU / Linux, mais malheureusement les solutions suggérées (par exemple cette question ) ne fonctionnent pas. Surtout, j'ai vu des gens suggérer iconvet recodemais je n'ai pas eu de chance avec ces outils. J'ai testé de nombreuses commandes, y compris les suivantes, et toutes ont échoué:

$ recode ISO-8859-15..UTF8 file.txt
$ iconv -f ISO8859-15 -t UTF-8 file.txt > out.txt
$ iconv -f WINDOWS-1252 -t UTF-8 file.txt > out.txt 

Rien de tout cela n'a fonctionné!

J'utilise Ubuntu-14.04 et je recherche une solution simple (GUI ou CLI) qui fonctionne exactement comme Notepad ++.

Un aspect important d'être "simple" est que l'utilisateur n'est pas tenu de déterminer le codage source; le codage source doit plutôt être automatiquement détecté par l'outil et seul le codage cible doit être fourni par l'utilisateur. Mais néanmoins, je serai également heureux de connaître une solution qui nécessite le codage source.

Si quelqu'un a besoin d'un cas de test pour examiner différentes solutions, l'exemple ci-dessus est accessible via ce lien .

Seyed Mohammad
la source
2
Essayez: vim '+set fileencoding=utf-8' '+wq' file.txt.
muru
Le persan devrait l'être, iso-639mais cela ne semble pas être disponible en iconvou recode. Au moins, je ne le vois pas dans la sortie de iconv -l.
terdon
@muru J'ai testé votre suggestion avec vimmais cela n'a pas fonctionné.
Seyed Mohammad
@SeyedMohammad avait toujours la même apparence?
muru
@muru Yup! Pas de changement.
Seyed Mohammad

Réponses:

12

Ces fichiers Windows avec du texte persan sont encodés dans Windows-1256 . Il peut donc être déchiffré par une commande similaire à OP essayée, mais avec des jeux de caractères différents. À savoir:

recode Windows-1256..UTF-8 <Windows_file.txt > UTF8_file.txt
(dénoncé suite aux plaintes de l'affiche originale; voir commentaires)

iconv -f Windows-1256 Windows_file.txt > UTF8_file.txt

Celui-ci suppose que la variable d'environnement LANG est définie sur une locale UTF-8. Pour convertir en n'importe quel encodage (UTF-8 ou autre), quel que soit l'environnement local actuel, on peut dire:

iconv -f Windows-1256 Windows_file.txt -t ${output_encoding} > ${output_file}

L'affiche originale est également confondue avec la sémantique des outils de recodage de texte (recode, iconv). Pour l'encodage source ( source.. ou -f), il faut spécifier l'encodage avec lequel le fichier est enregistré (par le programme qui l'a créé). Pas quelques suppositions (naïves) basées sur des caractères mojibake dans des programmes qui essaient (mais échouent) de le lire. Essayer soit ISO-8859-15 ou WINDOWS-1252 pour un texte persan était évidemment une impasse: ces encodages ne contiennent simplement aucune lettre persane.

Incnis Mrsi
la source
@Seyed Mohammad: maintenant avec des commandes spécifiées explicitement.
Incnis Mrsi
Merci! La deuxième commande (celle utilisant iconv) a fonctionné. Mais le premier (en utilisant recode) ne fonctionnait pas correctement et la sortie était toujours du charabia. Modifiez votre réponse pour inclure uniquement la iconvcommande et je la marquerai comme réponse.
Seyed Mohammad
1
Aussi pour être libre du réglage de la variable LANG, on peut faire: iconv -f WINDOWS-1256 -t UTF-8 in.txt > out.txtce que j'ai testé et travaillé. Il peut donc être judicieux de modifier votre commande comme ceci.
Seyed Mohammad
J'ai écrit un script utile basé sur la commande de travail que j'ai expliqué dans une autre réponse ici. J'espère que cela aidera d'autres utilisateurs persans de Linux car cela m'aidera beaucoup.
Seyed Mohammad
@karel: Merci, "se plaindre" est un verbe - la phrase a été écrite de façon non grammaticale.
Incnis Mrsi
1

En dehors de iconv, qui est un outil très utile seul ou dans un script, il existe une solution très simple que j'ai trouvée en essayant de résoudre le même problème pour les jeux de caractères grecs (Windows-1253 + ISO-8859-7).

Il vous suffit d'ouvrir le fichier texte via la boîte de dialogue "Ouvrir" de Gedit et non en double-cliquant dessus . Au bas de la boîte de dialogue se trouve une liste déroulante pour le codage, qui est définie sur "Détecté automatiquement" . Changez-le en "Windows-125x" ou tout autre jeu de codes approprié et le texte sera parfaitement lisible dans Gedit. Vous pouvez ensuite l'enregistrer en utilisant l'encodage UTF-8, juste pour être sûr que vous n'aurez plus jamais le même problème à l'avenir ...

Giorgos_tph
la source
1

Comme solution complémentaire au problème, j'ai préparé un script Bash utile basé sur la iconvcommande de la réponse d' Incnis Mrsi :

#!/bin/bash

if [ $# -lt 1 ]
then
   echo 'Specify at least one file to fix.'
   exit 1
fi

# Temp file to store conversion attempt(s).
tmp='tmp.fixed'

for file in "$@"
do
  # Try to fix the file encoding.
  if iconv -f WINDOWS-1256 "$file" -t UTF-8 > $tmp; then
    echo "Fixed: '$file'"
    cat $tmp > "$file"
  else
    echo "Failed to fix: '$file'"
  fi
done
rm $tmp

Enregistrez ce script sous fix-encoding.sh, donnez-lui la permission d'exécution en utilisant chmod +x fix-encoding.shet utilisez-le comme ceci:

./fix-encoding.sh myfile.txt my2ndfile.srt my3rdfile.sub

Ce script tentera de corriger l'encodage d'un nombre illimité de fichiers qui lui sont fournis en entrée. Notez que les fichiers seront corrigés sur place, donc le contenu sera écrasé.

Seyed Mohammad
la source
Vous n'avez pas besoin de mettre $ file hors de "  …  " car les variables sont développées entre guillemets ainsi qu'en texte ouvert. Seul '$ file' sera rendu littéralement, avec le signe dollar, par bash.
Incnis Mrsi
Comme je l'ai mentionné en réponse à la réponse publiée par «Incnis Mrsi», cette solution n'a pas fonctionné, tout comme ce script.
Seyed Mohammad
1

Je ne sais pas si cela fonctionne avec le persan: j'utilise Gedit, cela donne un défaut avec un mauvais encodage, et je peux choisir ce que je veux traduire en UTF-8, c'était juste du texte au format non éclairé, mais voici une capture d'écran !

entrez la description de l'image ici

Désolé, j'ai finalement pu accéder à mes fichiers texte, alors maintenant ils sont tous convertis.

J'ai aussi aimé Notepad ++, ça me manque encore.

Ken Mollerup
la source
Gedit ne peut pas résoudre le problème. Bien que Gedit n'affiche pas d'erreur de codage pour mon fichier, même lorsqu'il le fait, il ne peut pas le corriger. J'ai également essayé "enregistrer sous" avec l'encodage UTF-8 dans Gedit, mais cela ne résout pas le problème.
Seyed Mohammad
1

Si vous aimez travailler dans l'interface graphique au lieu de CLI, comme je le fais:

  1. Ouvrir un fichier avec Geany (éditeur)
  2. Allez dans le menu Fichier -> Recharger comme
  3. Choisissez l'encodage supposé pour changer le charabia en caractères identifiables dans votre langue. Par exemple, pour lire les sous-marins grecs, je rechargerais en Europe de l'Ouest -> Grec (Windows-1253)
  4. Allez dans le menu Document > Définir l'encodage -> Unicode -> UTF-8
  5. sauvegarder
Christos
la source
Ne fonctionne pas ..
Aurimas
0

La solution de travail que j'ai trouvée utilise l' éditeur de texte Microsoft Visual Studio Code qui est gratuit et disponible pour Linux.

Ouvrez le fichier que vous souhaitez convertir son encodage en VS-Code. Au bas de la fenêtre, il y a quelques boutons. L'un d'eux est lié à l'encodage du fichier, comme indiqué ci-dessous:

entrez la description de l'image ici

Un clic sur ce bouton fait apparaître un menu supérieur qui comprend deux éléments. Dans ce menu, sélectionnez l'option "Rouvrir avec encodage", comme ci-dessous:

entrez la description de l'image ici

Cela ouvrira un autre menu qui comprend une liste de différents encodages, comme indiqué ci-dessous. Sélectionnez maintenant "Arabe (Windows 1256)":

entrez la description de l'image ici

Cela corrigera le charabia comme ceci:

entrez la description de l'image ici

Maintenant, cliquez à nouveau sur le bouton d'encodage et cette fois sélectionnez l'option "Enregistrer avec l'encodage", comme ci-dessous:

entrez la description de l'image ici

Et dans le nouveau menu, sélectionnez l'option "UTF-8":

entrez la description de l'image ici

Cela enregistrera le fichier corrigé en utilisant l'encodage UTF-8:

entrez la description de l'image ici

Terminé! :)

Seyed Mohammad
la source
J'ai essayé "Enregistrer avec l'encodage" mais il montre le codage précédent, dans mon cas son UTF8
chaitanya