Je suis vraiment confus avec le codecs.open function
. Quand je fais:
file = codecs.open("temp", "w", "utf-8")
file.write(codecs.BOM_UTF8)
file.close()
Ça me donne l'erreur
UnicodeDecodeError: le codec 'ascii' ne peut pas décoder l'octet 0xef en position 0: l'ordinal n'est pas dans la plage (128)
Si je fais:
file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
Ça fonctionne bien.
Question est de savoir pourquoi la première méthode échoue? Et comment insérer la nomenclature?
Si la deuxième méthode est la bonne façon de le faire, quel est l'intérêt d'utiliser codecs.open(filename, "w", "utf-8")
?
python
utf-8
byte-order-mark
John Jiang
la source
la source
Réponses:
Je crois que le problème est que
codecs.BOM_UTF8
c'est une chaîne d'octets, pas une chaîne Unicode. Je soupçonne que le gestionnaire de fichiers essaie de deviner ce que vous voulez vraiment dire en se basant sur "Je suis censé écrire Unicode sous forme de texte encodé en UTF-8, mais vous m'avez donné une chaîne d'octets!"Essayez d'écrire directement la chaîne Unicode pour la marque d'ordre des octets (c'est-à-dire Unicode U + FEFF), de sorte que le fichier code simplement cela en UTF-8:
(Cela semble donner la bonne réponse - un fichier avec octets EF BB BF.)
EDIT: La suggestion de S. Lott d'utiliser "utf-8-sig" comme encodage est meilleure que d'écrire explicitement la nomenclature vous-même, mais je vais laisser cette réponse ici car elle explique ce qui n'allait pas auparavant.
la source
codecs.open
au lieu de simplementopen
Lisez ce qui suit: http://docs.python.org/library/codecs.html#module-encodings.utf_8_sig
Faites ceci
Le fichier résultant est UTF-8 avec la nomenclature attendue.
la source
temp.close()
?open
.@ S-Lott donne la bonne procédure, mais en développant les problèmes Unicode , l' interpréteur Python peut fournir plus d'informations.
Jon Skeet a raison (inhabituel) sur le
codecs
module - il contient des chaînes d'octets:Choisir un autre nit, le
BOM
a un nom Unicode standard , et il peut être entré comme:Il est également accessible via
unicodedata
:la source
J'utilise la commande file * nix pour convertir un fichier de jeu de caractères inconnu en un fichier utf-8
la source
# coding: utf8
au lieu de cela# -*- coding: utf-8 -*-
qui est beaucoup plus facile à retenir.