Écriture de fichier UTF-8 en Python
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()
Il me donne l'erreur
UnicodeDecodeError: 'ascii' codec ne peut pas décoder les octets 0xef en position
0: ordinal pas in range(128)
Si je fais:
file = open("temp", "w")
file.write(codecs.BOM_UTF8)
file.close()
Il fonctionne très bien.
Question est pourquoi le premier échec de la méthode? Et comment dois-je insérer le bom?
Si la deuxième méthode est la bonne manière de faire, ce que le point de l'utilisation de codecs.open(filename, "w", "utf-8")
?
- Ne pas utiliser une NOMENCLATURE en UTF-8. s'il vous Plaît.
- Hein? Pourquoi pas?
- La NOMENCLATURE n'est pas nécessaire en UTF-8 et seulement ajoute de la complexité (par exemple, vous ne pouvez pas simplement concaténer NOMENCLATURE avais des fichiers et de résultat avec le texte valide). Voir cette Q&A; ne manquez pas le grand commentaire sous Q
Vous devez vous connecter pour publier un commentaire.
Je crois que le problème, c'est que
codecs.BOM_UTF8
est une chaîne d'octets, pas une chaîne Unicode. Je soupçonne le gestionnaire de fichier est d'essayer de deviner ce que tu veux vraiment dire basé sur "je suis censé être écrit Unicode UTF-8-texte codé, mais vous m'avez donnée une chaîne d'octets!"Essayer d'écrire la chaîne Unicode pour la marque d'ordre d'octet (c'est à dire Unicode U+FEFF) directement, de sorte que le fichier de code pour que l'UTF-8:
(Qui semble donner le droit de réponse - un fichier avec des octets EF BB BF.)
EDIT: S. Lott est suggestion de l'aide "utf-8-sig" que l'encodage est mieux que d'être explicitement écrit la NOMENCLATURE de vous-même, mais je vais laisser cette réponse ici, comme il l'explique ce qui n'allait pas avant.
codecs.open
au lieu de simplementopen
Lire la suite: http://docs.python.org/library/codecs.html#module-encodings.utf_8_sig
Ce faire
Le fichier est en UTF-8 avec les attendus de la NOMENCLATURE.
@S-Lott donne le droit de procédure, mais en expansion sur le Unicode questions, le Python interprète peut fournir plus de connaissances.
Jon Skeet est droit (inhabituel) sur la
codecs
module - il contient les chaînes d'octets:La cueillette de l'autre lente, la
BOM
a une norme Unicode nom, et il peut être entré en tant que:Il est également accessible via
unicodedata
:- Je utiliser le fichier *nix commande pour convertir un jeu de caractères inconnu fichier dans un fichier utf-8
# coding: utf8
au lieu de# -*- coding: utf-8 -*-
qui est beaucoup plus facile à retenir.