Python, l'Encodage de sortie de l'UTF-8
J'ai une définition qui construit une chaîne composée de caractères codés UTF-8. Les fichiers de sortie sont ouverts à l'aide 'w+', "utf-8"
arguments.
Cependant, lorsque j'essaie de x.write(string)
- je obtenir le UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 1: ordinal not in range(128)
Je suppose que c'est parce que, normalement, par exemple vous ne `print(u'something'). Mais j'ai besoin d'utiliser une variable et les citations dans u'_' nier que...
Des suggestions?
EDIT: code ici:
source = codecs.open("actionbreak/" + target + '.csv','r', "utf-8")
outTarget = codecs.open("actionbreak/" + newTarget, 'w+', "utf-8")
x = str(actionT(splitList[0], splitList[1]))
outTarget.write(x)
Essentiellement tout ce qui est censé être fait est de bâtir une grande quantité de chaînes de caractères qui ressemblent à ceci:
[日木曜 Deliverables]= CASE WHEN things = 11
THEN C ELSE 0 END
- avez-vous essayez de faire x.write(string.encode('utf-8'))?
- S'il vous plaît montrer le code que vous utilisez pour ouvrir le fichier, et où vous êtes l'obtention de
u'\ufeff'
de. - Merci, a ajouté plus de détails
- Est l'erreur qui se produit sur la
write
ou de la ligne destr
un?
Vous devez vous connecter pour publier un commentaire.
Êtes-vous à l'aide de
codecs.open()
? Python 2.7 intégré dansopen()
ne prend pas en charge un codage spécifique, ce qui signifie que vous devez encoder manuellement des chaînes non ascii (comme d'autres l'ont noté), maiscodecs.open()
prend en charge que et serait probablement plus facile à tomber dans que manuellement l'encodage de toutes les chaînes.Que vous êtes réellement en utilisant
codecs.open()
, en passant par le code, et après un peu de chercher des choses moi-même, je vous suggère d'essayer d'ouvrir l'entrée et/ou le fichier de sortie avec le codage"utf-8-sig"
, qui permettra de gérer automatiquement le BOM UTF-8 (voir http://docs.python.org/2/library/codecs.html#encodings-and-unicode, près du bas de l'article) je pense que ce serait la seule question pour le fichier d'entrée, mais si aucune de ces combinaisons (utf-8-sig/utf-8, utf-8/utf-8-sig, utf-8-sig/utf-8-sig) de travail, alors je crois que la situation la plus probable serait que votre fichier d'entrée est codé dans un autre format Unicode avec BOM, comme Python par défaut UTF-8 codec interprète les Nomenclatures comme des caractères normaux donc l'entrée n'aurait pas un problème, mais la production pourrait.Viens de remarquer que cela, mais... lorsque vous utilisez
codecs.open()
, il s'attend à une chaîne Unicode, pas une codé; essayezx = unicode(actionT(splitList[0], splitList[1]))
.Votre erreur peut également se produire lorsque vous essayez de décoder une chaîne unicode (voir http://wiki.python.org/moin/UnicodeEncodeError), mais je ne pense pas que cela devrait être le cas, à moins que
actionT()
ou votre liste de fractionnement fait quelque chose pour les chaînes Unicode qui les amène à être traités comme des non-Unicode.UnicodeEncodeError: 'ascii' codec can't encode characters in position 1-3: ordinal not in range(128)
[テスト]= CASE WHEN T THEN c ELSE 0 END
il semble Donc que les caractères japonais sont à l'origine d'une erreur de codage. L'entrée de codage du fichier est contrôlable par moi. J'ai été en utilisant une codé en UTF-8 .csv en entrée, afin de préserver les caractères japonais[テスト]= CASE WHEN T
cela étant dit, vous avez certainement m'a conduit sur le droit chemin. Merci beaucoup!テスト
est le cp1252 interprétation de\xe3\x83\x86\xe3\x82\xb9\xe3\x83\x88
, qui est l'encodage UTF-8 deテスト
. Ouvrez le fichier de sortie avec lautf-8-sig
codec ainsi.En python 2.x il existe deux types de chaîne: chaîne d'octets et de chaîne unicode. Première contient les octets et dernier points de code unicode. Il est facile de déterminer, ce type de chaîne, il est unicode chaîne commence avec
u
:'abc' caractères sont les mêmes, parce que les sont dans la plage ASCII.
\u0430
est un point de code unicode, il est hors de la plage ASCII. "Le point de Code" python représentation interne de l'unicode des points, ils ne peuvent pas être enregistrées dans un fichier. Il est nécessaire de encoder à octets en premier. Voici comment unicode string ressemble (comme c'est codé, il devient une chaîne d'octets):Cette chaîne codée peut maintenant être écrite dans le fichier:
Maintenant, il est important de se rappeler, l'encodage que nous avons utilisé lors de l'écriture dans le fichier. Parce que pour être en mesure de lire les données, nous avons besoin de décoder le contenu. Voici ce que l'apparence des données, sans décodage:
Vous le voyez, nous avons codé octets, exactement le même que dans s.encode('utf8'). Pour décoder, il faut fournir de codage nom:
Après décodage, nous avons à notre chaîne unicode avec des points de code unicode.
codecs.open()
, explicite de l'encodage/décodage n'est pas nécessaire.xgord est bon, mais pour plus d'édification, il est intéressant de noter exactement ce que
\ufeff
moyens. Il est connu comme unBOM
ou unbyte order mark
et fondamentalement, c'est un rappel pour les premiers jours de l'unicode, quand les gens ne pouvaient pas convenir de la façon dont ils veulent que leur unicode aller. Maintenant, tous les documents unicode sont précédés d'un\ufeff
ou un\uffef
selon l'ordre dans lequel ils décident d'organiser leurs octets.Si vous frappez une erreur sur les personnages dans le premier endroit que vous pouvez être sûr que le problème, c'est que vous n'êtes pas d'essayer de le décoder comme utf-8, et le fichier est probablement encore de beaux.
\ufeff
. L'encodage réel de la NOMENCLATURE sera différent, mais le codepoint est toujours U+FEFF. Si vous êtes à la lecture comme\uffef
, vous avez votre endianness renversé.b'\xef\xbb\xbf'
puis l'encodage est UTF-8, bien sûr.)