UTF-8 совместимое сжатие в python - PullRequest
4 голосов
/ 14 октября 2010

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

import json,bz2
myString = "A very large string"  
zString = bz2.compress(myString)
json.dumps({ 'compressedData' : zString })

, что приведет к

UnicodeDecodeError: 'utf8' codec can't decode bytes in position 10-13: invalid data

Очевидным решением является bz2'ing всей структуры json, но давайте просто предположим, что я использую API-интерфейс blackbox, который выполняет jsonкодирование, и он хочет диктовать.

Кроме того, я просто использую bz2 в качестве примера, меня не волнует, что на самом деле алгоритм, хотя я заметил то же самое поведение с zlib.

Я могу понять, почему эти две библиотеки сжатия не создают вывод, совместимый с utf-8, но есть ли решение, которое может эффективно сжимать строки utf-8?Эта страница выглядела как золотой рудник http://unicode.org/faq/compression.html, но я не смог найти никакой соответствующей информации о питоне.

1 Ответ

11 голосов
/ 14 октября 2010

Вы имеете в виду «сжать до UTF-8 строк»?Я предполагаю, что, поскольку любой универсальный компрессор будет сжимать строки UTF-8.Однако ни один из реальных компрессоров не собирается сжимать до строки UTF-8.

Вы не можете хранить 8-битные данные, такие как UTF-8, непосредственно в JSON, потому что строки JSONопределяются как Unicode.Вам придется кодировать данные base64 перед передачей их в JSON:

json.dumps({ 'compressedData' : base64.b64encode(zString) })

Однако base64 по своей природе вызывает накладные расходы на кодирование 4/3.Если вы сжимаете типичные строковые данные, вы, вероятно, получите достаточное сжатие, чтобы это все равно было выигрышем, но это приводит к значительным накладным расходам.Вы можете найти кодировку с немного меньшими издержками, но не намного.

Обратите внимание, что если вы используете это для отправки данных в браузер, вам лучше позволить HTTP-сжатию делать это;он широко поддерживается и будет гораздо более надежным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...