Python3字节编码

时间:2018-10-11 11:26:36

标签: python string byte decode encode

我正在使用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 \ 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 / \ 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 :(得分:0)

您可以使用.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'))

编辑: 以下创建一个带有十进制数字的列表:

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

答案 1 :(得分:0)

问题在于这不是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)

这产生

  

根据Linux的Nel sottosistema Windows非声音安装分发版。   Le distribuzioni possono essere安装访问Microsoft Store:   https://aka.ms/wslstore