2009-05-04 12 views

Répondre

4

Utilisez la bibliothèque chardet pour détecter le codage.

+0

chardet n'est pas parfait, mais si des fichiers avec des encodages différents sont mélangés, c'est votre meilleur pari. – nosklo

+0

Chardet fonctionne mais il prend beaucoup trop de temps pour traiter tous les fichiers –

0

Vous pouvez vérifier le BOM au début du fichier pour vérifier s'il s'agit d'un fichier UTF.

Puis unicode.decode en conséquence (en utilisant l'un des standard encodings).

EDIT Ou, peut-être, essayez s.decode ('ascii') votre chaîne (s donné est le nom de la variable). Si elle lance UnicodeDecodeError, alors décodez-la en 'utf_16_le'.

+0

Tous les fichiers ne contiennent pas un en-tête de nomenclature – kgiannakakis

+0

ce n'est pas AScii c'est Windows-1252 je crois. python ne fait aucune exception quand j'essaie de décoder un fichier uft-16le en utilisant Windows-1252. –

+0

UnicodeDecodeError se produit lorsque la chaîne contient des caractères non ANSI. Aucune exception signifie que votre chaîne n'a pas ces caractères. Êtes-vous sûr que votre chaîne contient des caractères non-ANSI? À quoi ressemble votre chaîne avant et après la conversion? –

0

Que contient-il dans les fichiers? Si c'est un texte simple dans un alphabet latin, presque tous les autres octets les fichiers UTF-16LE seront zéro. En revanche, dans les fichiers Windows-1252, je ne m'attendrais pas à voir de zéros. Par exemple, voici “Hello” dans les fenêtres-1252:

93 48 65 6C 6C 6F 94 

... et en UTF-16LE:

1C 20 48 00 65 00 6C 00 6C 00 6F 00 1D 20 

Outre les citations bouclées, chaque personnage cartes à la même valeur, avec l'ajout d'un octet zéro à la fin. En fait, cela est vrai pour tous les caractères du jeu de caractères ISO-8859-1 (Windows-1252 étend ISO-8859-1 pour ajouter des mappages pour plusieurs caractères d'impression - comme des guillemets - pour remplacer les caractères de contrôle dans la plage 0x80..0x9F).

Si vous savez que tous les fichiers sont soit Windows-1252 ou UTF-16LE, un balayage rapide des zéros devrait être tout ce dont vous avez besoin pour déterminer lequel est. Il y a une bonne raison pour laquelle chardet est si lent et complexe, mais dans ce cas, je pense que vous pouvez vous en sortir rapidement.

Questions connexes