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
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-Type
devrait 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.).
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)