Двоичные данные в Unicode

1

Среди всех доступных здесь кодировок http://docs.python.org/library/codecs.html какой из них я должен использовать для декодирования двоичных данных в юникоде, если он не будет поврежден, когда я закодирую его обратно в строку?

Я использовал raw_unicode_data, и он не работает.

Пример: я загружаю изображение в POST (но не как вложение файла). Django преобразует данные POST в unicode с помощью utf-8. Однако при преобразовании из Unicode в строку (снова используя utf-8) данные становятся поврежденными. Я использовал raw_unicode_data, и то же самое произошло (хотя на этот раз всего несколько байтов). Какую кодировку следует использовать так, чтобы шаги декодирования и кодирования не искажали данные.

  • 5
    "двоичные данные"? Пожалуйста, определите, что вы имеете в виду, приведите пример и, возможно, даже предоставьте код, который вы используете для чтения, извлечения или создания этой вещи.
  • 2
    Пример кажется не заслуживающим доверия. bytes_representing_a_picture.decode ('utf8') гарантированно потерпит неудачу на 99,9% - если, конечно, Django не использует опции «ignore» или «replace» (aarrgghh)
Показать ещё 2 комментария
Теги:
character-encoding
binary
unicode
encoding

3 ответа

3
Лучший ответ

"Двоичные данные" не являются текстом, поэтому преобразование его в unicode бессмысленно. Если есть текст, встроенный в двоичные данные, сначала извлеките его и декодируйте, используя кодировку, указанную в спецификации для формата данных.

  • 5
    Двоичные данные могут означать что угодно. Это могут быть bytes из которых можно декодировать Unicode.
  • 0
    @ S.Lott: Если процесс извлечения просто использует все как есть, то пусть будет так. Но я поддерживаю мой ответ.
Показать ещё 2 комментария
7

Если вы хотите опубликовать двоичные данные, используйте кодировку base64.

http://docs.python.org/library/base64.html

1

Как уже говорили другие, ваш вопрос не особенно ясен. Если вы хотите вогнать двоичные данные через текстовый канал (например, POST), то base64 - правильный формат, который следует использовать с соответствующими операциями преобразования данных в клиенте и на сервере (двоичные данные → текст base64 → передать текстовый канал → base64 text → двоичные данные).

В качестве альтернативы, если вы хотите переносить неправильно закодированный текст (например, как Python 3 пытается сделать для некоторых интерфейсов, таких как пути к файлам и переменные среды), то Python 3.1 и более поздние версии предоставляют обработчик ошибок surrogatescape, который преобразует недопустимые значения в формате, который не является допустимым читаемым текстом, но позволяет корректно воссоздавать исходные двоичные данные при кодировании обратно в байты.

  • 1
    Проблема не в том, что POST является текстовым каналом, потому что это не так. Действительно, сервер будет съедать все до Content-Length без жалоб. Я предполагаю, что проблема, с которой сталкивается OP, заключается в том, что он пытается загрузить двоичный файл в поле POST, а анализатор полей (mod_wsgi или Django или любой другой) задыхается, когда находит двоичный символ амперсанда. Как мы и предложили, base64 должна решить эту проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню