读取编码为字节对象的字符串

时间:2017-05-08 23:45:37

标签: python python-3.x unicode encoding

我试图通过编码来掩盖字符串:

>>> 'monkey'.encode('utf-16')
b'\xff\xfem\x00o\x00n\x00k\x00e\x00y\x00'

然后我复制\xff\xfem\x00o\x00n\x00k\x00e\x00y\x00并将其粘贴到文件file.txt。

然后我想读取该文件并对其进行解码。

>>> with open('file.txt', 'rb') as f:
>>>     bytes_object = next(f).strip() # assume file has only one line
>>> bytes_object
b'\\xff\\xfem\\x00o\\x00n\\x00k\\x00e\\x00y\\x00' 

正在逃脱......而不是我想要的。

解码无法按预期工作。

>>> bytes_object.decode('utf-16')
'硜晦硜敦屭へ漰硜〰屮へ欰硜〰履へ礰硜〰'

显然,我不明白这里的意思。有没有办法读取和解码具有文本\xff\xfem\x00o\x00n\x00k\x00e\x00y\x00的文件?

2 个答案:

答案 0 :(得分:2)

复制和粘贴bytes对象的表示不是一件有用的事情。如果要创建UTF-16文件,请尝试以下操作:

with open('file.txt', 'wb') as fp:
    message = 'monkey'.encode('UTF16')
    fp.write(message)

答案 1 :(得分:1)

其他答案是准确的,因为将字节本身写入文件比复制和粘贴repr()表单(使用反斜杠-x)更简单。

但是你的问题是关于如何解析该表单,并且可以使用eval(),这基本上与repr()相反。这是一个交互式版本,它不使用文件写入/读取,而是执行相关操作。

>>> s = 'monkey'
>>> e = s.encode('utf-16')
>>> x = str(e)
>>> x
"b'\\xff\\xfem\\x00o\\x00n\\x00k\\x00e\\x00y\\x00'"
>>> eval(x)
b'\xff\xfem\x00o\x00n\x00k\x00e\x00y\x00'
>>> eval(x).decode('utf-16')
'monkey'