кодировать и декодировать строку байтов python

Я пытаюсь преобразовать входящую строку байта, которая содержит символы, отличные от 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.

Есть идеи?

EDIT: у меня есть кадры ethernet, которые хранятся в таблице mysql в виде blob (пожалуйста, все, оставайтесь на теме и не обсудите, почему в таблице есть пакеты). Сопоставление таблицы – utf-8, а слой db (sqlalchemy, non-orm) захватывает данные и создает структуры (буферы протокола google), которые хранят blob как python 'str'. В некоторых случаях я использую протокольные буферы напрямую без каких-либо проблем. В других случаях мне нужно выставить одни и те же данные через json. Я заметил, что когда json.dumps () делает свою вещь, «\ x80» можно заменить на недопустимый символ unicode (\ ufffd iirc)

3 Solutions collect form web for “кодировать и декодировать строку байтов python”

Вам необходимо изучить документацию для программного API-интерфейса, который вы используете. BLOB – это аббревиатура: BINARY Large Object.

Если ваши данные на самом деле двоичные, идея декодирования его в Unicode – это, конечно, глупость.

Если это текст, вам нужно знать, какую кодировку использовать для его декодирования в Unicode.

Затем вы используете json.dumps(a_Python_object) … если вы сами кодируете его в UTF-8, json будет декодировать его снова:

 >>> import json >>> json.dumps(u"\u0100\u0404") '"\\u0100\\u0404"' >>> json.dumps(u"\u0100\u0404".encode('utf8')) '"\\u0100\\u0404"' >>> 

ОБНОВЛЕНИЕ о latin1 :

u'\x80' – бесполезный бессмысленный контрольный символ C1 – кодирование крайне маловероятно, чтобы быть латинским-1. Latin-1 – это «ловушка и заблуждение» – все 8-битные байты декодируются в Unicode без привлечения исключения. Не путайте «работы» и «не возбуждайте исключение».

Используйте b.decode('name of source encoding') чтобы получить версию Unicode. Это было удивительно для меня, когда я это узнал. например:

 In [123]: 'foo'.decode('latin-1') Out[123]: u'foo' 

Я думаю, что вы пытаетесь выполнить декодирование строкового объекта некоторой кодировки. Вы знаете, что такое кодировка? Чтобы получить объект unicode.

 unicode_b = b.decode('some_encoding') 

а затем повторно кодирует объект unicode, используя кодировку utf_8, обратно к строковому объекту.

 b = unicode_b.encode('utf_8') 

Использование объекта unicode в качестве переводчика, не зная, что такое исходная кодировка строки, я не знаю наверняка, но есть вероятность, что преобразование не будет таким, как ожидалось. Объект unicode не предназначен для преобразования строк одной кодировки в другую. Я бы работал с объектом unicode, предполагая, что вы знаете, что такое кодировка, если вы не знаете, что такое кодировка, тогда действительно нет способа узнать без проб и ошибок, а затем преобразовать обратно в закодированную строку, когда вы хотите вернуть строковый объект.

  • В чем разница между префиксом u и префиксом unicode () в python?
  • Python с проблемами юникода MySql
  • Python ascii utf unicode
  • Чтение Python из файла и сохранение в utf-8
  • Отображение UTF8 stings в терминале Ubuntu с помощью скрипта Python
  • Notepad ++ конвертирует в UTF-8 несколько файлов
  • Python конвертирует html ascii-кодированный текст в utf8
  • UnicodeDecodeError: кодек ascii не может декодировать байт 0xd1 в позиции 2: порядковый номер не в диапазоне (128)
  • Выход Unicode в stdout Python при запуске из cmd.exe
  • В Python, как наиболее эффективно вырезать строку UTF-8 для доставки REST?
  • codecs.open (utf-8) не читает обычный ASCII-файл
  •  
    Interesting Posts for Van-Lav
    Python - лучший язык программирования в мире.