Encodage WINDOWS-1252 vers UTF-8

J'ai copié certains fichiers d'une machine Windows vers une machine Linux. Ainsi, tous les fichiers encodés Windows (windows-1252) doivent être convertis en UTF-8. Les fichiers qui sont déjà en UTF-8 ne doivent pas être modifiés. Je prévois d'utiliser l'utilitaire recode pour cela. Comment puis-je spécifier que l'utilitaire recode ne doit convertir que les fichiers encodés windows-1252 et non les fichiers UTF-8?

Exemple d'utilisation de recode:

recode windows-1252.. myfile.txt

Cela convertirait myfile.txt de windows-1252 en UTF-8. Avant de faire ceci, je voudrais savoir que myfile.txt est en fait encodé windows-1252 et non encodé en UTF-8. Sinon, je crois que cela corromprait le fichier.

29
demandé sur TRiG 2010-01-06 18:39:32

10 réponses

Comment vous attendez-vous à ce que recode sache Qu'un fichier est Windows-1252? En théorie, je crois que tout fichier est un fichier Windows-1252 valide, car il mappe tous les octets possibles à un caractère.

Maintenant, il y a certainement des caractéristiques qui suggéreraient fortement que C'est UTF-8 - si cela commence par la nomenclature UTF-8, par exemple-mais elles ne seraient pas définitives.

Une option serait de détecter s'il s'agit en fait d'un fichier UTF-8 complètement valide, je suppose... Encore une fois, ce ne serait que suggestif.

Je ne suis pas familier avec l'outil de recode lui - même, mais vous voudrez peut-être voir s'il est capable de recoder un fichier depuis et vers le même encodage - Si vous faites cela avec un fichier invalide (c'est-à-dire qui contient des séquences d'octets UTF-8 invalides), il peut très bien convertir les À ce stade, vous pouvez détecter qu'un fichier est valide UTF-8 en le recodant en UTF-8 et en voyant si l'entrée et la sortie sont identique.

Sinon, faites-le par programme plutôt que d'utiliser l'utilitaire recode - ce serait assez simple en C#, par exemple.

Juste pour réitérer cependant: tout cela est heuristique. Si vous ne connaissez vraiment pas l'encodage d'un fichier, Rien ne vous le dira avec une précision de 100%.

34
répondu Jon Skeet 2010-01-06 15:42:34

Vous pouvez utiliser iconv:

iconv -f WINDOWS-1252 -t UTF-8 filename.txt

58
répondu Gregory Pakosz 2012-08-16 21:03:54

Il n'y a aucun moyen général de dire si un fichier est encodé avec un encodage spécifique. Rappelez-vous qu'un encodage n'est rien de plus qu'un "accord" sur la façon dont les bits d'un fichier doivent être mappés aux caractères.

Si vous ne savez pas lesquels de vos fichiers sont déjà encodés en UTF-8 et lesquels sont encodés dans windows-1252, vous devrez inspecter tous les fichiers et le découvrir vous-même. Dans le pire des cas cela pourrait signifier que vous devez ouvrir chacun d'entre eux avec l'un des deux encodages et voir s'ils" semblent " corrects-c'est-à-dire que tous les caractères sont affichés correctement. Bien sûr, vous pouvez utiliser le support des outils pour ce faire, par exemple, si vous savez avec certitude que certains caractères sont contenus dans les fichiers qui ont un mappage différent dans windows-1252 vs UTF-8, Vous pouvez les grep après avoir exécuté les fichiers via 'iconv' comme mentionné par Seva Akekseyev.

Un autre cas chanceux pour vous serait, si vous savez que les fichiers ne contiennent que des caractères qui sont codés de manière identique dans UTF-8 et windows-1252. Dans ce cas, bien sûr, vous avez déjà terminé.

7
répondu kleiba 2010-01-06 15:52:58

Voici une transcription d'une autre réponse que j'ai donnée à une question similaire:

Si vous appliquez utf8_encode () à une chaîne déjà UTF8, elle retournera une sortie UTF8 brouillée.

J'ai fait une fonction qui répond à tous ces problèmes. Son encodage appelé:: toUTF8 ().

Vous n'avez pas besoin de savoir quel est le codage de vos chaînes. Il peut s'agir de Latin1 (iso 8859-1), Windows-1252 ou UTF8, ou la chaîne peut en avoir un mélange. Encoding:: toUTF8() va tout convertir en UTF8.

Je l'ai fait parce qu'un service me donnait un flux de données tout foiré, mélangeant UTF8 et Latin1 dans la même chaîne.

Utilisation:

$utf8_string = Encoding::toUTF8($utf8_or_latin1_or_mixed_string);

$latin1_string = Encoding::toLatin1($utf8_or_latin1_or_mixed_string);

Télécharger:

Https://github.com/neitanod/forceutf8

Mise à jour:

J'ai inclus une autre fonction, Encoding:: fixUFT8 (), qui corrigera chaque chaîne UTF8 qui semble brouillée.

Utilisation:

$utf8_string = Encoding::fixUTF8($garbled_utf8_string);

Exemples:

echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");
echo Encoding::fixUTF8("FÃÂédÃÂération Camerounaise de Football");
echo Encoding::fixUTF8("Fédération Camerounaise de Football");

Affichera:

Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football
Fédération Camerounaise de Football

Mise à jour: j'ai transformé le fonction (forceUTF8) dans une famille de fonctions statiques sur une classe appelée Encoding. La nouvelle fonction est encodage:: toUTF8 ().

7
répondu Sebastián Grignoli 2014-07-02 14:11:27

Utilisez la commandeiconv .

Pour vous assurer que le fichier se trouve dans Windows-1252, ouvrez-le dans le bloc-notes (sous Windows), puis cliquez sur Enregistrer sous. Notepad suggère l'encodage actuel par défaut; si C'est Windows-1252 (ou n'importe quelle page de code de 1 octet, d'ailleurs), il dirait "ANSI".

2
répondu Seva Alekseyev 2010-01-06 15:42:51

Si vous souhaitez renommer plusieurs fichiers en une seule commande ‒ disons que vous voulez convertir tous les *.txt fichiers ‒ voici la commande:

find . -name "*.txt" -exec iconv -f WINDOWS-1252 -t UTF-8 {} -o {}.ren \; -a -exec mv {}.ren {} \;
2
répondu Anthony O. 2016-01-19 15:54:53

Si vous êtes sûr que vos fichiers sont soit UTF-8 ou Windows 1252 (ou Latin1), vous pouvez profiter du fait que recode sortira avec une erreur si vous essayez de convertir un fichier invalide.

Alors que utf8 est valide Win-1252, l'inverse n'est pas vrai: win-1252 N'est pas valide UTF-8. Donc:

recode utf8..utf16 <unknown.txt >/dev/null || recode cp1252..utf8 <unknown.txt >utf8-2.txt

Va cracher des erreurs pour tous les fichiers cp1252, puis procéder à les convertir en UTF8.

Je voudrais envelopper cela dans un script bash plus propre, en gardant une sauvegarde de chaque converti fichier.

Avant de faire la conversion de charset, vous pouvez d'abord vous assurer que vous avez des fins de ligne cohérentes dans tous les fichiers. Sinon, recode se plaindra à cause de cela, et peut convertir des fichiers qui étaient déjà UTF8, mais qui avaient juste les mauvaises fins de ligne.

0
répondu mivk 2010-12-20 15:16:02

Vous pouvez modifier l'encodage d'un fichier avec un éditeur comme notepad++. Il suffit d'aller à l'Encodage et sélectionnez ce que vous voulez.

Je préfère toujours les fenêtres 1252

0
répondu thanos.a 2013-03-27 17:03:25

Trouvé cette documentation pour la commande TYPE :

Convertir un fichier ascii (Windows1252) en un fichier texte Unicode (UCS-2 le):

For /f "tokens=2 delims=:" %%G in ('CHCP') do Set _codepage=%%G    
CHCP 1252 >NUL    
CMD.EXE /D /A /C (SET/P=ÿþ)<NUL > unicode.txt 2>NUL    
CMD.EXE /D /U /C TYPE ascii_file.txt >> unicode.txt    
CHCP %_codepage%    

La technique ci-dessus (basée sur un script de Carlos M.) crée d'abord un fichier avec une marque D'ordre D'octets (BOM), puis ajoute le contenu du fichier d'origine. CHCP est utilisé pour s'assurer que la session est en cours d'exécution avec la page de code Windows1252 de sorte que les caractères 0xFF et 0xFE (Ÿ、) sont interprétés correctement.

0
répondu Napfkuchen 2015-10-01 21:47:49

UTF-8 n'a pas de nomenclature car elle est à la fois superflue et invalide. Où une nomenclature est utile est en UTF-16 qui peut être échangé par octet comme dans le cas de Microsoft. UTF-16 Si pour la représentation interne dans un tampon de mémoire. Utilisez UTF-8 pour l'échange. Par défaut, les deux UTF-8, Tout ce qui dérive de US-ASCII et UTF-16 sont l'ordre des octets naturels/réseau. Le Microsoft UTF-16 nécessite une nomenclature car il est échangé par octet.

Pour covert Windows-1252 à ISO8859-15, Je convertit D'abord ISO8859-1 en US-ASCII pour les codes avec des glyphes similaires. Je convertit ensuite Windows-1252 jusqu'à ISO8859-15, d'autres glyphes non-ISO8859-15 en plusieurs caractères US-ASCII.

0
répondu Andrew Buckeridge 2016-05-30 05:43:40