web-dev-qa-db-fra.com

UnicodeDecodeError: le codec 'utf-8' ne peut pas décoder l'erreur d'octet

J'essaie d'obtenir une réponse de urllib et de la décoderen un format lisible. Le texte est en hébreu et contient également des caractères tels que { et /

le codage en haut de page est:

# -*- coding: utf-8 -*-

chaîne brute est:

b'\xff\xfe{\x00 \x00\r\x00\n\x00"\x00i\x00d\x00"\x00 \x00:\x00 \x00"\x001\x004\x000\x004\x008\x003\x000\x000\x006\x004\x006\x009\x006\x00"\x00,\x00\r\x00\n\x00"\x00t\x00i\x00t\x00l\x00e\x00"\x00 \x00:\x00 \x00"\x00\xe4\x05\xd9\x05\xe7\x05\xd5\x05\xd3\x05 \x00\xd4\x05\xe2\x05\xd5\x05\xe8\x05\xe3\x05 \x00\xd4\x05\xea\x05\xe8\x05\xe2\x05\xd4\x05 \x00\xd1\x05\xde\x05\xe8\x05\xd7\x05\xd1\x05 \x00"\x00,\x00\r\x00\n\x00"\x00d\x00a\x00t\x00a\x00"\x00 \x00:\x00 \x00[\x00]\x00\r\x00\n\x00}\x00\r\x00\n\x00\r\x00\n\x00'

Maintenant j'essaye de le décoder en utilisant:

 data = data.decode()

et j'obtiens l'erreur suivante:

UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 0: invalid start byte
10
user1641071

Votre problème est que ce n'est pas UTF-8. Vous avez les données codées UTF-16, décodez-les comme telles:

>>> data = b'\xff\xfe{\x00 \x00\r\x00\n\x00"\x00i\x00d\x00"\x00 \x00:\x00 \x00"\x001\x004\x000\x004\x008\x003\x000\x000\x006\x004\x006\x009\x006\x00"\x00,\x00\r\x00\n\x00"\x00t\x00i\x00t\x00l\x00e\x00"\x00 \x00:\x00 \x00"\x00\xe4\x05\xd9\x05\xe7\x05\xd5\x05\xd3\x05 \x00\xd4\x05\xe2\x05\xd5\x05\xe8\x05\xe3\x05 \x00\xd4\x05\xea\x05\xe8\x05\xe2\x05\xd4\x05 \x00\xd1\x05\xde\x05\xe8\x05\xd7\x05\xd1\x05 \x00"\x00,\x00\r\x00\n\x00"\x00d\x00a\x00t\x00a\x00"\x00 \x00:\x00 \x00[\x00]\x00\r\x00\n\x00}\x00\r\x00\n\x00\r\x00\n\x00'
>>> data.decode('utf16')
'{ \r\n"id" : "1404830064696",\r\n"title" : "פיקוד העורף התרעה במרחב ",\r\n"data" : []\r\n}\r\n\r\n'
>>> import json
>>> json.loads(data.decode('utf16'))
{'title': 'פיקוד העורף התרעה במרחב ', 'id': '1404830064696', 'data': []}

Si vous avez chargé ceci depuis un site Web avec urllib.request, l'en-tête Content-Typedevrait contient un paramètre charset vous indiquant ceci; Si response est l'objet de réponse urllib.request renvoyé, utilisez:

codec = response.info().get_content_charset('utf-8')

La valeur par défaut est UTF-8 lorsqu'aucun paramètre charset n'a été défini, ce qui correspond au paramètre par défaut approprié pour les données JSON.

Vous pouvez également utiliser la bibliothèque requests pour charger la réponse JSON; elle gère le décodage automatiquement (y compris la détection automatique du codec UTF spécifique aux réponses JSON).

Remarque supplémentaire: le commentaire du codec PEP 263 est utilisé uniquement pour interpréter votre code source, y compris les littéraux de chaîne. Cela n'a rien à voir avec le codage de sources externes (fichiers, données réseau, etc.).

16
Martijn Pieters

J'ai eu cette erreur dans Django avec Python 3.4. J'essayais de faire en sorte que cela fonctionne avec Django-rest-framework .

C'est mon code qui a corrigé l'erreur UnicodeDecodeError: le codec 'utf-8' ne peut pas décoder l'erreur d'octet.

Ceci est le test de réussite:

import os
from os.path import join, dirname
import uuid
from rest_framework.test import APITestCase

class AttachmentTests(APITestCase):

    def setUp(self):
        self.base_dir = dirname(dirname(dirname(__file__)))

        self.image = join(self.base_dir, "source/test_in/aaron.jpeg")
        self.image_filename = os.path.split(self.image)[1]

    def test_create_image(self):
        id = str(uuid.uuid4())
        with open(self.image, 'rb') as data:
            # data = data.read()
            post_data = {
                'id': id,
                'filename': self.image_filename,
                'file': data
            }

            response = self.client.post("/api/admin/attachments/", post_data)

            self.assertEqual(response.status_code, 201)
0
Aaron Lelevier