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.
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%.
Vous pouvez utiliser iconv:
iconv -f WINDOWS-1252 -t UTF-8 filename.txt
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é.
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 ().
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".
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 {} \;
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.
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
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.
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.