La meilleure façon de convertir des fichiers texte entre des jeux de caractères?

526

Quel est l'outil ou la méthode la plus rapide et la plus simple pour convertir des fichiers texte entre des jeux de caractères?

Plus précisément, je dois convertir UTF-8 en ISO-8859-15 et vice versa.

Tout y passe: des lignes simples dans votre langage de script préféré, des outils en ligne de commande ou d'autres utilitaires pour OS, sites Web, etc.

Les meilleures solutions à ce jour:

Sous Linux / UNIX / OS X / cygwin:

  • L' icône Gnu suggérée par Troels Arvin est mieux utilisée comme filtre . Il semble être universellement disponible. Exemple:

    $ iconv -f UTF-8 -t ISO-8859-15 in.txt > out.txt
    

    Comme l'a souligné Ben , il existe un convertisseur en ligne utilisant iconv .

  • Gnu recode ( manuel ) proposé par Cheekysoft convertira un ou plusieurs fichiers sur place . Exemple:

    $ recode UTF8..ISO-8859-15 in.txt
    

    Celui-ci utilise des alias plus courts:

    $ recode utf8..l9 in.txt
    

    Recode prend également en charge les surfaces qui peuvent être utilisées pour convertir entre différents types de fin de ligne et encodages:

    Convertir les sauts de ligne de LF (Unix) en CR-LF (DOS):

    $ recode ../CR-LF in.txt
    

    Fichier de codage Base64:

    $ recode ../Base64 in.txt
    

    Vous pouvez également les combiner.

    Convertissez un fichier UTF8 encodé en Base64 avec des fins de ligne Unix en fichier Latin 1 encodé en Base64 avec des fins de ligne Dos:

    $ recode utf8/Base64..l1/CR-LF/Base64 file.txt
    

Sous Windows avec Powershell ( Jay Bazuzi ):

  • PS C:\> gc -en utf8 in.txt | Out-File -en ascii out.txt

    (Pas de prise en charge ISO-8859-15 cependant; il indique que les jeux de caractères pris en charge sont unicode, utf7, utf8, utf32, ascii, bigendianunicode, default et oem.)

Éditer

Voulez-vous dire support iso-8859-1? Utiliser "String" le fait par exemple pour l'inverse

gc -en string in.txt | Out-File -en utf8 out.txt

Remarque: Les valeurs d'énumération possibles sont "Inconnu, Chaîne, Unicode, Octet, BigEndianUnicode, UTF8, UTF7, Ascii".

Antti Sykäri
la source
J'ai essayé gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlmais il convertit le fichier en utf-8 mais alors c'est vide! Notepad ++ dit que le fichier est au format Ansi, mais si je comprends bien, ce n'est même pas un jeu de caractères valide ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE
2
Il suffit de tomber sur cette recherche d'une réponse à une question connexe - excellent résumé! Je pensais juste que cela valait la peine d'être ajouté qui recodeagira également comme un filtre si vous ne lui transmettez aucun nom de fichier, par exemple:recode utf8..l9 < in.txt > out.txt
Jez
iconv.com/iconv.htm semble être mort pour moi? (timeout)
Andrew Newby
2
Si vous utilisez enca, vous n'avez pas besoin de spécifier l'encodage d'entrée. Il suffit souvent juste pour préciser la langue: enca -L ru -x utf8 FILE.TXT.
Alexander Pozdneev
1
En fait, iconv fonctionnait beaucoup mieux en tant que convertisseur sur place au lieu d'un filtre. La conversion d'un fichier de plus de 2 millions de lignes en utilisant iconv -f UTF-32 -t UTF-8 input.csv > output.csvn'a enregistré qu'environ sept cent mille lignes, seulement un tiers. L'utilisation de la version sur place a iconv -f UTF-32 -t UTF-8 file.csvréussi à convertir les 2 millions de lignes et plus.
Nicolay77

Réponses:

246

Approche utilitaire autonome

iconv -f ISO-8859-1 -t UTF-8 in.txt > out.txt
-f ENCODING  the encoding of the input
-t ENCODING  the encoding of the output

Vous n'avez pas besoin de spécifier l'un de ces arguments. Ils seront par défaut à votre locale actuelle, qui est généralement UTF-8.

Troels Arvin
la source
4
Pour toute autre personne qui se fait trébucher parce que les versions non-dash ne sont pas disponibles, il semble que les versions OSX (et peut-être toutes les BSD) d'iconv ne prennent pas en charge les alias non-dash pour les différents encodages UTF- *. iconv -l | grep UTFvous indiquera tous les encodages UTF que votre copie d'iconv prend en charge.
coredumperror
14
Vous ne connaissez pas l'encodage de votre fichier d'entrée? Utilisez chardet in.txtpour générer une meilleure estimation. Le résultat peut être utilisé comme ENCODAGE dans iconv -f ENCODING.
Ragoût
4
Empêcher la sortie à des caractères non valides ( en évitant les illegal input sequence at positionmessages), et remplacer les caractères « bizarres » avec des personnages « similaires »: iconv -c -f UTF-8 -t ISO-8859-1//TRANSLIT in.txt > out.txt.
knb
J'aime cela, car il est standard sur la plupart des plates-formes NIX. Mais aussi voir l'option de commande VIM (alias: ex) ci - dessous . Informations supplémentaires: (1) vous (probablement) n'avez pas besoin de spécifier l' -foption (de) avec iconv. (2) la file --mime-encoding <file/s>commande peut vous aider à comprendre l'encodage en premier lieu.
fr13d
1
FWIW la filecommande a signalé ma source comme UTF-16 Little Endian; en cours d'exécution l'a iconv -f UTF-16 -t UTF-8...transformé incorrectement en ASCII, j'ai dû explicitement spécifier la iconv -f UTF-16LE...sortie UTF-8
Platon
90

Essayez VIM

Si vous en avez, vimvous pouvez utiliser ceci:

Non testé pour chaque encodage.

La partie intéressante à ce sujet est que vous n'avez pas besoin de connaître l'encodage source

vim +"set nobomb | set fenc=utf8 | x" filename.txt

Sachez que cette commande modifie directement le fichier


Partie explicative!

  1. +: Utilisé par vim pour entrer directement la commande lors de l'ouverture d'un fichier. Habituellement utilisé pour ouvrir un fichier sur une ligne spécifique:vim +14 file.txt
  2. |: Séparateur de plusieurs commandes (comme ;dans bash)
  3. set nobomb : pas de nomenclature utf-8
  4. set fenc=utf8: Définir un nouvel encodage sur le lien doc utf-8
  5. x : Enregistrer et fermer le fichier
  6. filename.txt : chemin d'accès au fichier
  7. ": qotes sont ici à cause des tuyaux. (sinon bash les utilisera comme pipe bash)
Boop
la source
Assez cool, mais un peu lent. Existe-t-il un moyen de changer cela pour convertir un certain nombre de fichiers à la fois (économisant ainsi sur les coûts d'initialisation de vim)?
DomQ
Merci pour votre explication! J'avais du mal avec le début du fichier jusqu'à ce que je me renseigne sur le paramètre bombe / nobomb.
jjwdesign
1
np, en plus, vous pouvez voir la nomenclature si vous utilisez vim -bouhead file.txt|cat -e
Boop
1
par exemple:find -regextype posix-extended -type f -regex ".*\.(h|cpp|rc|fx|cs|props|xaml)" -exec vim +'set nobomb | set fenc=utf8 | x' {} \;
Gabriel
Je l'ai utilisé pour convertir l'encodage des fichiers CSV et j'étais vraiment excité quand j'ai vu que le jeu de caractères avait en effet changé. Malheureusement, lorsque je suis allé charger le fichier dans MySQL, il y avait un nombre de colonnes différent de ce qu'il avait avant d'exécuter la commande vim. Vous vous demandez s'il serait possible d'ouvrir simplement le fichier, de convertir l'encodage et de sauvegarder / fermer le fichier tout en laissant tous les autres contenus de fichiers identiques?
NightOwlPrgmr du
39

Sous Linux , vous pouvez utiliser le très puissant recodage commande pour essayer de convertir entre les différents jeux de caractères, ainsi que des problèmes de fin de ligne. recode -l vous montrera tous les formats et encodages entre lesquels l'outil peut convertir. Ce sera probablement une TRÈS longue liste.

Cheekysoft
la source
Comment vous convertissez-vous LF? Il y a /CRet /CR-LFmais pas/LF
Aaron Franke
21

iconv (1)

iconv -f FROM-ENCODING -t TO-ENCODING file.txt

Il existe également des outils basés sur des icônes dans de nombreuses langues.

Daniel Papasian
la source
1
Qu'en est-il de la détection automatique de l'encodage d'origine?
Aaron Franke
20
Get-Content -Encoding UTF8 FILE-UTF8.TXT | Out-File -Encoding UTF7 FILE-UTF7.TXT

La version la plus courte, si vous pouvez supposer que la nomenclature d'entrée est correcte:

gc FILE.TXT | Out-File -en utf7 file-utf7.txt
Jay Bazuzi
la source
1
Voici une version plus courte qui fonctionne mieux. gc .\file-utf8.txt | sc -en utf7 .\file-utf7.txt
Larry Battle
@LarryBattle: Comment Set-Contentfonctionne mieux que Out-File?
Jay Bazuzi
...Oh. Je suppose que c'est presque la même chose. J'ai eu du mal à exécuter votre exemple car je supposais que les deux versions utilisaient le même file-utf8.txtfichier d'entrée car elles avaient toutes les deux le même fichier de sortie que file-utf7.txt.
Larry Battle
Ce serait vraiment génial, sauf qu'il ne prend pas en charge UTF16. Il prend en charge UTF32, mais pas UTF16! Je n'aurais pas besoin de convertir des fichiers, sauf que beaucoup de logiciels Microsoft (par exemple SQL Server bcp) insistent sur UTF16 - et que leur utilitaire ne se convertira pas en lui. Intéressant pour le moins.
Noah
J'ai essayé gc -en Ascii readme.html | Out-File -en UTF8 readme.htmlmais il convertit le fichier en utf-8 mais alors c'est vide! Notepad ++ dit que le fichier est au format Ansi, mais si je comprends bien, ce n'est même pas un jeu de caractères valide ?? uk.answers.yahoo.com/question/index?qid=20100927014115AAiRExF
OZZIE
16

Essayez la fonction Iconv Bash

Je l'ai mis dans .bashrc:

utf8()
{
    iconv -f ISO-8859-1 -t UTF-8 $1 > $1.tmp
    rm $1
    mv $1.tmp $1
}

..pour pouvoir convertir des fichiers comme ceci:

utf8 MyClass.java
Arne Evertsson
la source
8
il vaut mieux utiliser tmp = $ (mktmp) pour créer un fichier temporaire. De plus, la ligne avec rm est redondante.
LMZ
1
pouvez-vous compléter cette fonction avec le format d'entrée de détection automatique?
mlibre
3
attention, cette fonction supprime le fichier d'entrée sans vérifier que l'appel iconv a réussi.
philwalk
Cela modifie le contenu du fichier texte. J'ai exécuté cela sur un UTF-8 avec BOM en espérant sortir un UTF-8 sans fichier BOM, mais il a été ajouté au début du fichier.
Aaron Franke
14

Essayez Notepad ++

Sous Windows, j'ai pu utiliser Notepad ++ pour effectuer la conversion d' ISO-8859-1 en UTF-8 . Cliquez sur "Encoding"puis sur "Convert to UTF-8".

Jeremy Glover
la source
13

Oneliner utilisant find, avec détection automatique du jeu de caractères

Le codage des caractères de tous les fichiers texte correspondants est détecté automatiquement et tous les fichiers texte correspondants sont convertis en utf-8codage:

$ find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -bi "$1" |sed -e "s/.*[ ]charset=//") -t utf-8 -o converted "$1" && mv converted "$1"' -- {} \;

Pour effectuer ces étapes, un sous-shell shest utilisé avec -exec, exécutant une ligne avec l' -cindicateur et passant le nom de fichier comme argument positionnel "$1"avec -- {}. Entre les deux, le utf-8fichier de sortie est temporairement nommé converted.

Par quoi file -bisignifie:

  • -b, --brief Ne pas ajouter de noms de fichiers aux lignes de sortie (mode bref).

  • -i, --mime Force la commande file à afficher des chaînes de type mime plutôt que les chaînes lisibles par l'homme plus traditionnelles. Ainsi, il peut dire par exemple text/plain; charset=us-asciiplutôt que ASCII text. La sedcommande réduit cela uniquement us-asciicomme requis par iconv.

La findcommande est très utile pour une telle automatisation de la gestion des fichiers. Cliquez ici pour plus à findgogo .

Serge Stroobandt
la source
3
J'ai dû adapter un peu cette solution pour travailler sur Mac OS X, au moins sur ma version. find . -type f -iname *.txt -exec sh -c 'iconv -f $(file -b --mime-encoding "$1" | awk "{print toupper(\$0)}") -t UTF-8 > converted "$1" && mv converted "$1"' -- {} \;
Brian J. Miller,
1
Votre code a également fonctionné sur Windows 7 avec MinGW-w64 (dernière version). Merci de le partager!
silvioprog
@rmuller La sedcommande est là exprès, permettant la détection automatique de l'encodage des caractères. J'ai développé la réponse pour l'expliquer maintenant. Il serait courtois à l'égard du lectorat de supprimer tout commentaire non pertinent restant. Je vous remercie.
Serge Stroobandt
@SergeStroobandt Peut-être que je n'étais pas assez clair. Mon point est que lorsque vous utilisez "file -b --mime-encoding" au lieu de "file -bi", il n'est pas nécessaire de filtrer le résultat avec sed. Cette commande renvoie déjà uniquement l'encodage du fichier. Donc dans votre exemple "us-ascii"
rmuller
Cela ne semble vraiment rien faire pour moi sur Linux. J'ai enregistré un fichier au format UTF-8 avec BOM et je m'attendais à ce qu'il se convertisse en UTF-8 sans BOM et il ne l'a pas fait.
Aaron Franke
3

PHP iconv ()

iconv("UTF-8", "ISO-8859-15", $input);

user15096
la source
1
Cette déclaration fonctionne très bien lors de la conversion de chaînes, mais pas pour les fichiers.
jjwdesign
2

DOS / Windows: utilisez la page de code

chcp 65001>NUL
type ascii.txt > unicode.txt

La commande chcppeut être utilisée pour modifier la page de codes. La page de codes 65001 est le nom Microsoft pour UTF-8. Après avoir défini la page de codes, la sortie générée par les commandes suivantes sera de la page de codes définie.

lalthomas
la source
1

pour écrire le fichier de propriétés (Java) normalement j'utilise ceci sous linux (distributions mint et ubuntu):

$ native2ascii filename.properties

Par exemple:

$ cat test.properties 
first=Execução número um
second=Execução número dois

$ native2ascii test.properties 
first=Execu\u00e7\u00e3o n\u00famero um
second=Execu\u00e7\u00e3o n\u00famero dois

PS: J'ai écrit l'exécution numéro un / deux en portugais pour forcer les caractères spéciaux.

Dans mon cas, lors de la première exécution, j'ai reçu ce message:

$ native2ascii teste.txt 
The program 'native2ascii' can be found in the following packages:
 * gcj-5-jdk
 * openjdk-8-jdk-headless
 * gcj-4.8-jdk
 * gcj-4.9-jdk
Try: sudo apt install <selected package>

Lorsque j'ai installé la première option (gcj-5-jdk), le problème était terminé.

J'espère que cela aide quelqu'un.

Maciel Bombonato
la source
0

Mon outil préféré est Jedit (un éditeur de texte basé sur java) qui a deux fonctionnalités très pratiques:

  • Celui qui permet à l'utilisateur de recharger un texte avec un encodage différent (et, en tant que tel, de contrôler visuellement le résultat)
  • Un autre qui permet à l'utilisateur de choisir explicitement l'encodage (et le caractère de fin de ligne) avant d'enregistrer
yota
la source
0

Modifiez simplement l'encodage du fichier chargé dans IntelliJ IDEA IDE, à droite de la barre d'état (en bas), où le jeu de caractères actuel est indiqué. Il vous invite à recharger ou convertir, utilisez Convertir. Assurez-vous d'avoir sauvegardé le fichier d'origine à l'avance.

Nikolai Varankine
la source
0

Si les applications de l'interface graphique macOS sont votre pain et beurre, SubEthaEdit est l'éditeur de texte auquel je vais habituellement pour l'encodage-wrangling - son "aperçu de conversion" vous permet de voir tous les caractères invalides dans l'encodage de sortie, et de les corriger / supprimer.

Et c'est open-source maintenant, alors oui pour eux 😉.

tiennou
la source