2015-01-08 3 views
0

Как закодировать байтовую строку с байтами без ascii в формате utf8? Например:Кодировать строку байта в utf8

x = zlib.compress(pickle.dumps(numpy.random.rand(10, 10))) 

# What to do here? 
y = x.encode('utf8') 

Это даст мне сообщение о том, что некоторые байты не находятся в диапазоне (128). Что я должен сделать?

+0

Кодирование преобразует строку юникода в последовательность байтов. 'zlib.compress' уже возвращает последовательность байтов, это не строка Юникода, поэтому кодирование его как utf-8 не имеет смысла. – Duncan

ответ

1

Вы должны решить, к какому кодовому узлу относится байт, отличный от ASCII. Например, к какой кодовой точке относится байт 0xA1?

Например, вы можете использовать любой из изо-8859-X кодировок:

bytes = chr(161) 
utf8 = bytes.decode('iso-8859-1').encode('utf-8') 
# compare with: utf8 = bytes.decode('iso-8859-2').encode('utf-8') 

Обратите внимание, что выбор кодировки делает различие - в соответствии с ИСО 8859-1 байт 0xA1 кодируется в виде u'\xc2\xa1' но под iso-8859-2 он закодирован как u'\xc4\x84'.

+0

Спасибо, это работает, но после .decode ('iso-8859-1'). Encode ('utf-8') кажется, что длина строки увеличивается вдвое. Есть ли кодировка, которая может использоваться в первую очередь, которая сохраняет конечную длину строки? – shaoyl85

+0

Нет. Точка utf-8 - это компактное кодирование 32-битных целых чисел. Если вы не хотите, чтобы длина изменилась, почему вы кодируете utf-8 в первую очередь? Просто используйте оригинальную строку. Вам нужно объяснить, почему вы не можете просто использовать исходную строку. – ErikR

+0

У меня есть функция, которая принимает строку как аргумент, но почему-то проверяет, является ли входная строка utf8 или unicode. У меня есть сжатая строка байтов. – shaoyl85

Смежные вопросы