Python3 байтов кодирования - PullRequest
       21

Python3 байтов кодирования

0 голосов
/ 11 октября 2018

Я работаю с python3 и у меня проблема с представлением объекта.
Это результат subprocess.Open().communicate()[0], который является байтовым массивом, но когда я передаю его другой функции, python интерпретирует егов виде строки, которая не является.
Это мой массив:

b'N \ x00e \ x00l \ x00 \ x00s \ x00o \ x00t \ x00t \ x00o \ x00s \x00i \ x00s \ x00t \ x00e \ x00m \ x00a \ x00 \ x00W \ x00i \ x00n \ x00d \ x00o \ x00w \ x00s \ x00 \ x00p \ x00e \ x00r \ x00 \ x00L \ x00i \ x00n \ x00u \ x00x \ x00ux00n \ x00o \ x00n \ x00 \ x00s \ x00o \ x00n \ x00o \ x00 \ x00i \ x00n \ x00s \ x00t \ x00a \ x00l \ x00l \ x00a \ x00t \ x00e \ x00 \ x00d \ x00i \ x00s \ x00t \ x00rx00i \ x00b \ x00u \ x00z \ x00i \ x00o \ x00n \ x00i \ x00. \ x00 \ r \ x00 \ r \ x00 \ n \ x00L \ x00e \ x00d \ x00i \ x00s \ x00t \ x00r \ x00i \ x00b\ x00u \ x00z \ x00i \ x00o \ x00n \ x00i \ x00 \ x00p \ x00o \ x00s \ x00s \ x00o \ x00n \ x00o \ x00 \ x00e \ x00s \ x00s \ x00e \ x00r \ x00e \ x00 \ x00i \ x00n \ x00s\ x00t \ x00a \ x00l \ x00l \ x00a \ x00t \ x00e \ x00 \ x00v \ x00i \ x00s \ x00i \ x00t \ x00a \ x00n \ x00d \ x00o \ x00 \ x00M \ x00i \ x00c \ x00r \ x00o \ x00s x00o \ x00s\ x00f \ x00t \ x00 \ x00S \ x00t \ x00o \ x00r \ x00e \ x00: \x00 \ г \ x00 \ г \ x00 \ п \ x00h \ x00t \ x00t \ x00p \ x00s \ x00:. \ x00 / \ x00 / \ x00a \ x00k \ x00a \ x00 \ x00m \ x00s \ x00 / \ x00w \ x00s\ x00l \ x00s \ x00t \ x00o \ x00r \ x00e \ x00 \ r \ x00 \ r \ x00 \ n \ x00 '

Что в кодировке ASCII, верно?

У меня вопрос, как я могу закодировать его, чтобы увидеть правильные байтовые значения?
Или, по крайней мере, есть способ передать его другой функции, если она не была распознана как строка, а это не так?

Спасибо!

Ответы [ 2 ]

0 голосов
/ 21 апреля 2019

Проблема в том, что это не UTF-8, а UTF-16.

#!/bin/python3

var = b'N\x00e\x00l\x00 \x00s\x00o\x00t\x00t\x00o\x00s\x00i\x00s\x00t\x00e\x00m\x00a\x00 \x00W\x00i\x00n\x00d\x00o\x00w\x00s\x00 \x00p\x00e\x00r\x00 \x00L\x00i\x00n\x00u\x00x\x00 \x00n\x00o\x00n\x00 \x00s\x00o\x00n\x00o\x00 \x00i\x00n\x00s\x00t\x00a\x00l\x00l\x00a\x00t\x00e\x00 \x00d\x00i\x00s\x00t\x00r\x00i\x00b\x00u\x00z\x00i\x00o\x00n\x00i\x00.\x00\r\x00\r\x00\n\x00L\x00e\x00 \x00d\x00i\x00s\x00t\x00r\x00i\x00b\x00u\x00z\x00i\x00o\x00n\x00i\x00 \x00p\x00o\x00s\x00s\x00o\x00n\x00o\x00 \x00e\x00s\x00s\x00e\x00r\x00e\x00 \x00i\x00n\x00s\x00t\x00a\x00l\x00l\x00a\x00t\x00e\x00 \x00v\x00i\x00s\x00i\x00t\x00a\x00n\x00d\x00o\x00 \x00M\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00 \x00S\x00t\x00o\x00r\x00e\x00:\x00\r\x00\r\x00\n\x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00a\x00k\x00a\x00.\x00m\x00s\x00/\x00w\x00s\x00l\x00s\x00t\x00o\x00r\x00e\x00\r\x00\r\x00\n\x00'

foo = str(var, 'utf-16')

print(foo)

Это дает

Nel sottosistema Windows для Linux без установки дистрибутива Linux.Вы можете установить и посетить Microsoft Store: https://aka.ms/wslstore

0 голосов
/ 11 октября 2018

Вы можете декодировать его с помощью .decode('utf-8'). Чтобы удалить нулевые байты, используйте .replace(b'\x00', b'')

subprocessoutput = b'N\x00e\x00l\x00 \x00s\x00o\x00t\x00t\x00o\x00s\x00i\x00s\x00t\x00e\x00m\x00a\x00 \x00W\x00i\x00n\x00d\x00o\x00w\x00s\x00 \x00p\x00e\x00r\x00 \x00L\x00i\x00n\x00u\x00x\x00 \x00n\x00o\x00n\x00 \x00s\x00o\x00n\x00o\x00 \x00i\x00n\x00s\x00t\x00a\x00l\x00l\x00a\x00t\x00e\x00 \x00d\x00i\x00s\x00t\x00r\x00i\x00b\x00u\x00z\x00i\x00o\x00n\x00i\x00.\x00\r\x00\r\x00\n\x00L\x00e\x00 \x00d\x00i\x00s\x00t\x00r\x00i\x00b\x00u\x00z\x00i\x00o\x00n\x00i\x00 \x00p\x00o\x00s\x00s\x00o\x00n\x00o\x00 \x00e\x00s\x00s\x00e\x00r\x00e\x00 \x00i\x00n\x00s\x00t\x00a\x00l\x00l\x00a\x00t\x00e\x00 \x00v\x00i\x00s\x00i\x00t\x00a\x00n\x00d\x00o\x00 \x00M\x00i\x00c\x00r\x00o\x00s\x00o\x00f\x00t\x00 \x00S\x00t\x00o\x00r\x00e\x00:\x00\r\x00\r\x00\n\x00h\x00t\x00t\x00p\x00s\x00:\x00/\x00/\x00a\x00k\x00a\x00.\x00m\x00s\x00/\x00w\x00s\x00l\x00s\x00t\x00o\x00r\x00e\x00\r\x00\r\x00\n\x00'

print(subprocessoutput.replace(b'\x00', b'').decode('utf-8'))

edit: следующее создает список с десятичными числами ascii:

ascii = [ord(x) for x in subprocessoutput.decode('utf-8')]
...