2014-07-08 5 views
9

Ich versuche, eine Antwort von urllib zu bekommen und es zu einem lesbaren Format zu decodieren. Der Text ist in Hebräisch und enthält auch Zeichen wie { und /UnicodeDecodeError: 'utf-8' Codec kann Byte-Fehler nicht decodieren

Top-Seite Codierung:

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

raw String wird:

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' 

Jetzt mit Ich versuche, sie zu entschlüsseln:

data = data.decode() 

und ich erhalte den folgenden Fehler:

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

Antwort

15

Ihr Problem ist, dass das nicht UTF-8 ist. Sie haben UTF-16 codierten Daten dekodieren sie als solche:

>>> 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': []} 

Wenn Sie dies von einer Website mit urllib.request geladen, die Content-Type Kopf sollte enthalten einen charset Parameter Sie das sagen; wenn das responseurllib.request Antwortobjekt zurückgegeben wird, dann verwenden:

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

Voreingestellt ist UTF-8, wenn kein charset Parameter eingestellt worden ist, welche der entsprechende Standard für JSON Daten sind.

Verwenden Sie alternativ requests library, um die JSON-Antwort zu laden. Die Dekodierung wird automatisch behandelt (einschließlich der JSON-spezifischen UTF-Codec-Autodetektion).

Eine weitere Anmerkung: die PEP 263 source code codec comment wird nur verwendet, um Ihren Quellcode einschließlich Zeichenfolgenliterale zu interpretieren. Es hat nichts mit Kodierungen von externen Quellen (Dateien, Netzwerkdaten, etc.) zu tun.

+0

Das war ziemlich schnell und hilfreich, danke! – user1641071

0

Ich habe diesen Fehler in Django mit Python 3.4. Ich habe versucht, dies mit django-rest-framework zu arbeiten.

Dies war mein Code, der den Fehler UnicodeDecodeError behoben: 'utf-8' Codec kann Byte-Fehler nicht decodieren. Diese

ist das Bestehen der Prüfung:

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) 
Verwandte Themen