Я пытаюсь преобразовать входящую строку байтов, содержащую символы, отличные от ascii, в действительную строку utf-8, которую я могу сбросить как json.
b = '\x80'
u8 = b.encode('utf-8')
j = json.dumps(u8)
Я ожидал, что j будет '\xc2\x80', но вместо этого я получаю:
UnicodeDecodeError: 'ascii' codec can't decode byte 0x80 in position 0: ordinal not in range(128)
В моей ситуации «b» исходит из mysql через буферы протокола Google и заполняется некоторыми данными blob.
Есть идеи?
РЕДАКТИРОВАТЬ: у меня есть кадры Ethernet, которые хранятся в таблице mysql в виде большого двоичного объекта (пожалуйста, все, оставайтесь в теме и не обсуждайте, почему в таблице есть пакеты). Сопоставление таблиц - utf-8, а уровень db (sqlalchemy, non-orm) захватывает данные и создает структуры (буферы протокола Google), которые хранят большой двоичный объект как python 'str'. В некоторых случаях я использую буферы протокола напрямую без каких-либо проблем. В других случаях мне нужно предоставить те же данные через json. Что я заметил, так это то, что когда json.dumps() делает свое дело, «\ x80» может быть заменен недопустимым символом юникода (\ ufffd iirc)
json.dumps
производить �. Вам нужно точно сказать, что должен сделать потребитель этого JSON-пакета, чтобы восстановить исходный пакет. - person John Machin   schedule 08.03.2012