Quelques observations et questions:
(1) ASCII est un sous-ensemble de UTF-8 dans le sens que si un fichier peut être décodé avec succès en ASCII, alors il peut être décodé avec succès en utilisant UTF-8. Vous pouvez donc sortir l'ASCII de votre liste. (2) Les deux termes de findreplace vont-ils jamais inclure des caractères non-ASCII? Notez qu'une réponse de "oui" indiquerait que l'objectif d'écrire un fichier de sortie dans le même jeu de caractères que l'entrée peut être difficile/impossible à réaliser.
(3) Pourquoi ne pas écrire TOUS les fichiers de sortie dans l'encodage SAME handle-all-Unicode-characters, par ex. UTF-8?
(4) Les fichiers UTF-8 ont-ils une nomenclature?
(5) Quels autres jeux de caractères prévoyez-vous gérer? (6) Laquelle des quatre possibilités (UTF-16LE/UTF-16BE) x (BOM/no BOM) appelez-vous UTF-16? Notez que je ne cherche délibérément pas à déduire quoi que ce soit de la présence de 'utf-16' dans votre code.
(7) Notez que chardet
ne détecte pas UTF-16xE sans nomenclature. chardet
a d'autres angles morts avec des jeux de caractères non * x et plus anciens.
Mise à jour Voici quelques extraits de code que vous pouvez utiliser pour déterminer ce qu'est «ANSI» et essayer de décoder en utilisant une liste restreinte de codages. Remarque: cela suppose un environnement Windows.
# determine "ANSI"
import locale
ansi = locale.getdefaultlocale()[1] # produces 'cp1252' on my Windows box.
f = open("input_file_path", "rb")
data = f.read()
f.close()
if data.startswith("\xEF\xBB\xBF"): # UTF-8 "BOM"
encodings = ["utf-8-sig"]
elif data.startswith(("\xFF\xFE", "\xFE\xFF")): # UTF-16 BOMs
encodings = ["utf16"]
else:
encodings = ["utf8", ansi, "utf-16le"]
# ascii is a subset of both "ANSI" and "UTF-8", so you don't need it.
# ISO-8859-1 aka latin1 defines all 256 bytes as valid codepoints; so it will
# decode ANYTHING; so if you feel that you must include it, put it LAST.
# It is possible that a utf-16le file may be decoded without exception
# by the "ansi" codec, and vice versa.
# Checking that your input text makes sense, always a very good idea, is very
# important when you are guessing encodings.
for enc in encodings:
try:
udata = data.decode(enc)
break
except UnicodeDecodeError:
pass
else:
raise Exception("unknown encoding")
# udata is your file contents as a unicode object
# When writing the output file, use 'utf8-sig' as the encoding if you
# want a BOM at the start.
liés « Python et travailler avec encodages » http://stackoverflow.com/questions/819310/python-and-working-with-encodings – jfs