247 votes

Écrire dans le fichier utf-8 en python

Je suis vraiment confus avec la fonction codecs.open. Quand je fais :

Il me donne l’erreur

UnicodeDecodeError : codec « ascii » ne peut pas décoder l’octet 0xef en position 0 : ordinal pas dans range(128)

Si je le fais :

Il fonctionne très bien.

Question, c’est pourquoi la première méthode échoue-t-il ? Et comment puis-je insérer le bom ?

Si la deuxième méthode est la bonne façon de le faire, ce que le point d’utiliser codecs.open (nom de fichier, "w", "utf-8") ?

311voto

Jon Skeet Points 692016

Avertissement: je ne suis pas un programmeur Python.

Je crois que le problème c'est qu' 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!"

Essayez 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:

import codecs

file = codecs.open("lol", "w", "utf-8")
file.write(u'\ufeff')
file.close()

(Qui semble donner le droit de réponse - un fichier avec des octets EF BB BF.)

EDIT: S. Lott la suggestion de l'utilisation de "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.

200voto

S.Lott Points 207588

Lisez ce qui suit : http://docs.python.org/library/codecs.html#module-encodings.utf_8_sig

Pour ce faire

Le fichier résultant est UTF-8 avec la nomenclature prévue.

12voto

gimel Points 30150

@S-Lott donne le droit de procédure, mais l'expansion de l' Unicode des questions, le Python interprète peut fournir plus de connaissances.

Jon Skeet est droit (inhabituel) à propos de l' codecs module - il contient les chaînes d'octets:

>>> import codecs
>>> codecs.BOM
'\xff\xfe'
>>> codecs.BOM_UTF8
'\xef\xbb\xbf'
>>>

Cueillette à un autre nit, l' BOM a une norme Unicode nom, et il peut être entré en tant que:

>>> bom= u"\N{ZERO WIDTH NO-BREAK SPACE}"
>>> bom
u'\ufeff'

Il est également accessible via unicodedata:

>>> import unicodedata
>>> unicodedata.lookup('ZERO WIDTH NO-BREAK SPACE')
u'\ufeff'
>>>

10voto

Ricardo Points 108

J’utilise le fichier * nix commande pour convertir un fichier de jeu de caractères inconnus dans un fichier utf-8

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X