web-dev-qa-db-fra.com

u '\ ufeff' dans la chaîne Python

Je reçois une erreur avec le motif suivant:

UnicodeEncodeError: 'ascii' codec can't encode character u'\ufeff' in position 155: ordinal not in range(128)

Pas sûr de ce que u'\ufeff' est, il apparaît lorsque je suis en train de gratter Web. Comment puis-je remédier à la situation? La méthode chaîne .replace() ne fonctionne pas.

101
James Hallen

Le caractère Unicode U+FEFF est la marque d'ordre des octets, ou BOM, et sert à indiquer la différence entre le codage UTF-16 grand et petit boutien. Si vous décodez la page Web à l'aide du bon codec, Python la supprimera pour vous. Exemples:

#!python2
#coding: utf8
u = u'ABC'
e8 = u.encode('utf-8')        # encode without BOM
e8s = u.encode('utf-8-sig')   # encode with BOM
e16 = u.encode('utf-16')      # encode with BOM
e16le = u.encode('utf-16le')  # encode without BOM
e16be = u.encode('utf-16be')  # encode without BOM
print 'utf-8     %r' % e8
print 'utf-8-sig %r' % e8s
print 'utf-16    %r' % e16
print 'utf-16le  %r' % e16le
print 'utf-16be  %r' % e16be
print
print 'utf-8  w/ BOM decoded with utf-8     %r' % e8s.decode('utf-8')
print 'utf-8  w/ BOM decoded with utf-8-sig %r' % e8s.decode('utf-8-sig')
print 'utf-16 w/ BOM decoded with utf-16    %r' % e16.decode('utf-16')
print 'utf-16 w/ BOM decoded with utf-16le  %r' % e16.decode('utf-16le')

Notez que EF BB BF est une nomenclature codée en UTF-8. Il n'est pas requis pour UTF-8, mais sert uniquement de signature (généralement sous Windows).

Sortie:

utf-8     'ABC'
utf-8-sig '\xef\xbb\xbfABC'
utf-16    '\xff\xfeA\x00B\x00C\x00'    # Adds BOM and encodes using native processor endian-ness.
utf-16le  'A\x00B\x00C\x00'
utf-16be  '\x00A\x00B\x00C'

utf-8  w/ BOM decoded with utf-8     u'\ufeffABC'    # doesn't remove BOM if present.
utf-8  w/ BOM decoded with utf-8-sig u'ABC'          # removes BOM if present.
utf-16 w/ BOM decoded with utf-16    u'ABC'          # *requires* BOM to be present.
utf-16 w/ BOM decoded with utf-16le  u'\ufeffABC'    # doesn't remove BOM if present.

Notez que le codec utf-16 nécessite la présence de nomenclatures ou Python ne sait pas si les données sont volumineuses. - ou petit endian.

142
Mark Tolonen

J'ai rencontré ceci sur Python 3 et j'ai trouvé cette question (et solution ). Lors de l'ouverture d'un fichier, Python 3 prend en charge le mot-clé d'encodage pour gérer automatiquement l'encodage.

Sans cette valeur, la nomenclature est incluse dans le résultat de la lecture:

>>> f = open('file', mode='r')
>>> f.read()
'\ufefftest'

En donnant le codage correct, la nomenclature est omise dans le résultat:

>>> f = open('file', mode='r', encoding='utf-8-sig')
>>> f.read()
'test'

Juste mes 2 cents.

86
siebz0r

Ce caractère est le BOM ou "Byte Order Mark". Il est généralement reçu comme les premiers octets d'un fichier, vous expliquant comment interpréter le codage du reste des données. Vous pouvez simplement supprimer le personnage pour continuer. Cependant, puisque l'erreur indique que vous essayez de convertir en "ascii", vous devriez probablement choisir un autre encodage pour ce que vous avez essayé de faire.

4
swstephe

Le contenu que vous grattez est codé en unicode plutôt qu'en texte ascii et vous obtenez un caractère qui ne se convertit pas en ascii. La "traduction" appropriée dépend de ce que la page Web d'origine pensait être. La page unicode de Python explique comment cela fonctionne.

Essayez-vous d’imprimer le résultat ou de le coller dans un fichier? L'erreur suggère que c'est l'écriture des données à l'origine du problème, sans le lire. Cette question est un bon endroit pour chercher les correctifs.

4
theodox

Ce problème se pose essentiellement lorsque vous enregistrez votre code python dans un encodage UTF-8 ou UTF-16 car python ajoute un caractère spécial au début du fichier. Code automatiquement (qui n'est pas affiché par les éditeurs de texte) pour identifier le format de codage. Mais, lorsque vous essayez d’exécuter le code, vous obtenez l’erreur de syntaxe de la ligne 1: début du code car le compilateur python comprend le codage ASCII,. lorsque vous affichez le code de fichier à l'aide de la fonction read (), vous pouvez voir au début du code renvoyé '\ ufeff' est affiché. La solution la plus simple à ce problème consiste simplement à redéfinir le codage sur ASCII codage (pour cela, vous pouvez copier votre code dans un bloc-notes et le sauvegarder. Rappelez-vous! Choisissez le ASCII encodage ... J'espère que cela vous aidera.

0
Jagdish Chauhan