J'ai un fichier texte encodé ANSI qui n'aurait pas dû être encodé en ANSI car il y avait des caractères accentués que ANSI ne prend pas en charge. Je préfère travailler avec UTF-8.
Les données peuvent-elles être décodées correctement ou sont-elles perdues lors du transcodage?
Quels outils pourrais-je utiliser?
Voici un échantillon de ce que j'ai:
ç é
Je peux dire d'après le contexte (le café devrait être le café) que ces deux caractères devraient être:
ç é
EDIT: Une possibilité simple à éliminer avant d'entrer dans des solutions plus compliquées: avez-vous essayé de définir le jeu de caractères sur utf8 dans l'éditeur de texte dans lequel vous lisez le fichier? Cela pourrait simplement être le cas de quelqu'un qui vous envoie un fichier utf8 que vous lisez dans un éditeur défini comme cp1252.
En prenant simplement les deux exemples, il s'agit d'un cas où utf8 est lu à travers l'objectif d'un codage à un octet, probablement l'un des iso-8859-1, iso-8859-15 ou cp1252. Si vous pouvez publier des exemples d'autres caractères problématiques, il devrait être possible de les affiner davantage.
Comme l'inspection visuelle des caractères peut être trompeuse, vous devrez également regarder les octets sous-jacents: le § que vous voyez à l'écran peut être 0xa7 ou 0xc2a7, et cela déterminera le type de conversion de jeu de caractères que vous devez faire.
Pouvez-vous supposer que toutes vos données ont été déformées exactement de la même manière - qu'elles proviennent de la même source et ont subi la même séquence de transformations, de sorte que, par exemple, il n'y a pas un seul é dans votre texte, c'est toujours UNE§? Si tel est le cas, le problème peut être résolu avec une séquence de conversions de jeux de caractères. Si vous pouvez être plus précis sur l'environnement dans lequel vous vous trouvez et la base de données que vous utilisez, quelqu'un ici peut probablement vous dire comment effectuer la conversion appropriée.
Sinon, si les caractères problématiques ne se produisent qu'à certains endroits de vos données, vous devrez le prendre instance par instance, en fonction d'hypothèses telles que "aucun auteur n'a l'intention de mettre ç dans leur texte, donc chaque fois que vous voyez le remplacer par ç ". Cette dernière option est plus risquée, d'une part parce que ces hypothèses sur les intentions des auteurs peuvent être fausses, d'autre part parce que vous devrez repérer vous-même chaque personnage problématique, ce qui pourrait être impossible s'il y a trop de texte à inspecter visuellement ou s'il est écrit dans une langue ou un système d'écriture qui vous est étranger.
Suivez ces étapes avec Notepad ++
1- Copiez le texte original
2- Dans Notepad ++, ouvrez un nouveau fichier, changez Encoding -> choisissez un encodage que vous pensez que le texte original suit. Essayez aussi le codage "ANSI" car parfois les fichiers Unicode sont lus en ANSI par certains programmes
3- Coller
4- Puis pour convertir en Unicode en revenant sur le même menu: Encodage -> "Encoder en UTF-8" (pas "Convertir en UTF-8") et j'espère qu'il deviendra lisible
Les étapes ci-dessus s'appliquent à la plupart des langues. Il vous suffit de deviner l'encodage d'origine avant de le coller dans notepad ++, puis de le convertir via le même menu en un autre encodage basé sur Unicode pour voir si les choses deviennent lisibles.
La plupart des langages existent sous 2 formes d'encodage: 1- L'ancienne forme ANSI (ASCII) héritée, à seulement 8 bits, était initialement utilisée par la plupart des ordinateurs. 8 bits ne permettaient que 256 possibilités, 128 d'entre eux où les caractères latins et de contrôle réguliers, les 128 derniers bits ont été lus différemment selon les paramètres de langue du PC 2- Le nouveau standard Unicode (jusqu'à 32 bits) donne un code unique pour chaque caractère dans toutes les langues actuellement connues et bien d'autres à venir. si un fichier est unicode, il doit être compris sur n'importe quel PC avec la police de la langue installée. Notez que même UTF-8 va jusqu'à 32 bits et est aussi large que UTF-16 et UTF-32 seulement il essaie de rester 8 bits avec des caractères latins juste pour économiser de l'espace disque
Lorsque vous voyez des séquences de caractères comme ç et à ©, cela indique généralement qu'un fichier UTF-8 a été ouvert par un programme qui le lit en tant qu'ANSI (ou similaire). Caractères Unicode tels que ceux-ci:
U + 00C2 Lettre majuscule latine A accent circonflexe
U + 00C3 Lettre majuscule latine A avec tilde
U + 0082 Pause autorisée ici
U + 0083 Pas de pause ici
ont tendance à apparaître dans le texte ANSI en raison de la stratégie d'octets variables utilisée par UTF-8. Cette stratégie est très bien expliquée ici .
L'avantage pour vous est que l'apparence de ces caractères étranges facilite la recherche et donc le remplacement des instances de conversion incorrecte.
Je crois que, puisque ANSI utilise toujours 1 octet par caractère, vous pouvez gérer cette situation avec une simple opération de recherche et remplacement. Ou plus commodément, avec un programme qui inclut un mappage de table entre les séquences incriminées et les caractères souhaités, comme ceux-ci:
â € œ -> "# devrait être une double citation bouclée d'ouverture
â €? -> "# devrait être une double citation bouclée de fermeture
Tout texte donné, en supposant qu'il soit en anglais, aura un nombre relativement faible de différents types de substitutions.
J'espère que ça t'as aidé.
Avec vim depuis la ligne de commande:
vim -c "set encoding=utf8" -c "set fileencoding=utf8" -c "wq" filename
Utilisez iconv - voir La meilleure façon de convertir des fichiers texte entre des jeux de caractères?
Dans l'éditeur de texte sublime, fichier -> rouvrir avec encodage -> choisissez l'encodage correct.
Généralement, l'encodage est détecté automatiquement, mais sinon, vous pouvez utiliser la méthode ci-dessus.
Si vous voyez des points d'interrogation dans le fichier ou si les accents sont déjà perdus, revenir à utf8 n'aidera pas votre cause. par exemple. si un café est devenu un café - changer l'encodage seul ne vous aidera pas (et vous aurez besoin de données originales).
Pouvez-vous coller du texte ici, cela nous aidera à répondre à coup sûr.
Et puis il y a le programme recode un peu plus ancien.
J'ai trouvé un moyen simple de détecter automatiquement les encodages de fichiers - changez le fichier en fichier texte (sur un mac renommez l'extension de fichier en .txt) et faites-le glisser vers une fenêtre de Mozilla Firefox (ou Fichier -> Ouvrir). Firefox détectera l'encodage - vous pouvez voir ce qu'il a trouvé sous Affichage -> Encodage des caractères.
J'ai changé l'encodage de mon fichier en utilisant TextMate une fois que je connaissais l'encodage correct. Fichier -> Rouvrir en utilisant l'encodage et choisissez votre encodage. Ensuite, Fichier -> Enregistrer sous et changez l'encodage en UTF-8 et les fins de ligne en LF (ou tout ce que vous voulez)
Sous OS X Synalyze It! vous permet d'afficher des parties de votre fichier dans différents encodages (tous pris en charge par la bibliothèque ICU). Une fois que vous savez quel est l'encodage source vous pouvez copier le fichier entier (octets) via le presse-papiers et l'insérer dans un nouveau document où l'encodage cible (UTF-8 ou tout ce que vous voulez) est sélectionné.
Très utile lorsque vous travaillez avec UTF-8 ou d'autres représentations Unicode est nicodeChecker
Il existe des programmes qui essaient de détecter l'encodage d'un fichier comme chardet . Ensuite, vous pouvez le convertir en un encodage différent en utilisant iconv. Mais cela nécessite que le texte d'origine soit toujours intact et qu'aucune information ne soit perdue (par exemple en supprimant les accents ou les lettres accentuées entières).
J'ai trouvé cette question lors de la recherche d'une solution à un problème de page de code que j'avais avec les caractères chinois, mais à la fin mon problème était simplement un problème avec Windows ne les affichant pas correctement dans l'interface utilisateur.
Dans le cas où quelqu'un d'autre aurait ce même problème, vous pouvez le résoudre simplement en changeant le local dans Windows en Chine, puis à nouveau.
J'ai trouvé la solution ici:
La réponse de Gabriel a également été appréciée en regardant les données dans le bloc-notes ++, ce qui m'a informé des fenêtres.