Fichiers de conversion par lots pour l'encodage

Réponses:

36

Cygwin ou GnuWin32 fournissent des outils Unix tels que iconvet dos2unix(et unix2dos). Sous Unix / Linux / Cygwin, vous voudrez utiliser "windows-1252" comme codage au lieu de ANSI (voir ci-dessous). (À moins que vous ne sachiez que votre système utilise une page de codes autre que 1252 comme page de codes par défaut, auquel cas vous devrez indiquer à iconv la page de codes appropriée pour la traduction.)

Convertir de l'un ( -f) à l'autre ( -t) avec:

$ iconv -f windows-1252 -t utf-8 infile > outfile

Ou sous une forme de tout-trouver-conquérir:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 {} \> {} \;

Alternativement:

## this will clobber the original files!
$ find . -name '*.txt' -exec iconv --verbose -f windows-1252 -t utf-8 -o {} {} \;

Cette question a été posée à plusieurs reprises sur ce site. Voici donc quelques informations supplémentaires sur "ANSI". Dans une réponse à une question connexe, CesarB mentionne :

Il existe plusieurs codages appelés "ANSI" dans Windows. En fait, ANSI est un terme impropre . iconv n'a aucun moyen de deviner ce que vous voulez.

Le codage ANSI est le codage utilisé par les fonctions "A" de l'API Windows (les fonctions "W" utilisent UTF-16). Le codage auquel il correspond dépend généralement de la langue de votre système Windows. Le plus courant est le CP 1252 (également appelé Windows-1252). Ainsi, lorsque votre éditeur dit ANSI, cela signifie "quelles que soient les fonctions de l'API utilisées comme codage ANSI par défaut", qui est le codage non Unicode par défaut utilisé dans votre système (et donc généralement celui utilisé pour les fichiers texte).

La page à laquelle il renvoie renvoie à cette information historique (tirée d' un fichier Microsoft PDF ) sur les origines du CP 1252 et de l'ISO-8859-1, un autre encodage souvent utilisé:

[...] Cela vient du fait que la page de code Windows 1252 était à l'origine basée sur un brouillon ANSI, qui est devenue la norme ISO 8859-1. Toutefois, lors de l'ajout de points de code à la plage réservée aux codes de contrôle dans la norme ISO, la page de codes Windows 1252 et les pages de codes Windows suivantes, basées à l'origine sur la série ISO 8859-x, s'écartaient de l'ISO. À ce jour, il n'est pas rare que la communauté de développement, à l'intérieur et à l'extérieur de Microsoft, confonde la page de codes 8859-1 avec Windows 1252, ainsi que la mention "ANSI" ou "A" utilisée pour indiquer le support des pages de codes Windows. .

Quack Quack
la source
4
N'utilisez pas le même nom de fichier en entrée et en sortie! iconvsemble tronquer les fichiers à 32 768 octets s’ils dépassent cette taille. Comme il écrit dans le fichier qu'il tente de lire, il parvient à faire le travail si le fichier est suffisamment petit, sinon il tronque le fichier sans avertissement ...
Niavlys
1
FYI Cette question est étiquetée avec osx et il ne semble pas que l'une des commandes convert-all fonctionne sur Yosemite ou El Cap. La version iconv Apple livrée ne prend pas en charge --verbose ou -o, et l’autre syntaxe de redirection de syntaxe stdout ne fonctionne pas pour une raison quelconque et l’envoie simplement à stdout standard.
Scott McIntyre
28

avec Powershell, vous pouvez faire quelque chose comme ceci:

%  get-content IN.txt | out-file -encoding ENC -filepath OUT.txt

tandis que ENC est quelque chose comme unicode, ascii, utf8, utf32. checkout 'aide out-file'.

pour convertir tous les fichiers * .txt d'un répertoire en utf8, procédez comme suit:

% foreach($i in ls -name DIR/*.txt) { \
       get-content DIR/$i | \
       out-file -encoding utf8 -filepath DIR2/$i \
  }

qui crée une version convertie de chaque fichier .txt dans DIR2.

EDIT: Pour remplacer les fichiers dans tous les sous-répertoires, utilisez:

% foreach($i in ls -recurse -filter "*.java") {
    $temp = get-content $i.fullname
    out-file -filepath $i.fullname -inputobject $temp -encoding utf8 -force
}
Akira
la source
La conversion d'ANSI en UTF via votre première proposition efface tout le contenu de mon fichier texte ...
Acroneos
@Acroneos: vous avez alors commis une erreur: le fichier dans le fichier est IN.txt, le fichier de sortie est OUT.txt ... de cette façon, il est impossible d'écraser l'original. Si vous avez utilisé le même nom de fichier pour IN.txt et OUT.txt, vous écrasez évidemment le fichier que vous lisez.
Akira
Powershell sera converti au format UTF avec nomenclature. find et iconv pourraient être beaucoup plus faciles.
pparas
6

La page Wikipedia sur les nouvelles lignes comporte une section sur les utilitaires de conversion .

Cela semble être votre meilleur choix pour une conversion utilisant uniquement les outils livrés avec Windows:

TYPE unix_file | FIND "" /V > dos_file
Nagul
la source
3

UTFCast est un convertisseur Unicode pour Windows qui prend en charge le mode de traitement par lots. J'utilise la version payante et je suis assez à l'aise avec cela.

UTFCast est un convertisseur Unicode qui vous permet de convertir par lots tous les fichiers texte en codages UTF d’un simple clic de souris. Vous pouvez l'utiliser pour convertir un répertoire contenant des fichiers texte en codages UTF, y compris UTF-8, UTF-16 et UTF-32, en un répertoire de sortie, tout en conservant la structure de répertoires des fichiers d'origine. Même si votre fichier texte a une extension différente, UTFCast peut automatiquement détecter les fichiers texte et les convertir.

Carreleur
la source
On dirait qu'ils ne peuvent pas convertir dans le même dossier, mais dans un autre dossier de destination.
Uwe Keim
La version pro permet la conversion sur place. 20 $ / 3 mois. rotatingscrew.com/utfcast-version-comparison.aspx
SherylHohman
Oh, la version express (gratuite) est inutile - elle ne fait que "détecter" utf-8 WITH BOM !! (tout le monde peut le faire que ). Seule la version Pro qui se renouvelle automatiquement tous les 3 mois à 20 USD, sera détectée automatiquement. Le prix est raide pour un utilisateur non-entreprise. ET Faites attention si vous essayez la version de base et que votre fichier est déjà utf-8 (sans nomenclature), alors ce convertisseur le détectera en tant qu'ASCII, puis (re -) le "convertira" en utf-8, ce qui pourrait entraîner un charabia. . Soyez conscient si cela avant d'essayer la version express! Ils ont une version de démonstration pour le pro qui ne produit aucune sortie - inutile à mon humble avis parce que je ne peux pas vérifier les résultats avant d’acheter!
SherylHohman le
3

Oneliner using find, avec détection automatique

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, une coque sous shest utilisé avec -exec, l' exécution d' une seule ligne avec le -cdrapeau, et en passant le nom de fichier de l'argument de position "$1"avec -- {}. Entre les deux, le utf-8fichier de sortie est nommé temporairement converted.

Cette findcommande est très utile pour une telle automatisation de la gestion de fichiers.

Cliquez ici pour plus à findgogo .

Serge Stroobandt
la source
1

iconv -f original_charset -t utf-8 originalfile > newfile

exécutez la commande ci-dessus dans la boucle.

Aneesh Garg
la source
0

Vous pouvez utiliser EncodingMaster . C'est gratuit, il a une version Windows, Linux et Mac OS X et fonctionne vraiment bien.

Francisco Vera
la source
1
Le site que vous mentionnez est fermé.
Etienne Delavennat
0

Dans mon cas d'utilisation, j'avais besoin de la détection automatique du codage d'entrée et il y avait beaucoup de fichiers avec Windows-1250codage, pour lesquels la commande est file -bi <FILE>retournée charset=unknown-8bit. Ce paramètre n'est pas valide pour iconv.

J'ai eu les meilleurs résultats avec Enca .

Convertir tous les fichiers avec l'extension txt en utf-8

find . -type f -iname *.txt -exec sh -c 'echo "$1" && enca "$1" -x utf-8' -- {} \;
Bedla
la source