如何解码字节对象的字符串表示形式?

时间:2019-02-26 15:44:42

标签: python python-3.x decode

我有一个字符串,其中包含编码的字节:

str1 = "b'Output file \xeb\xac\xb8\xed\x95\xad\xeb\xb6\x84\xec\x84\x9d.xlsx Created'"

我想对其进行解码,但是由于它已经变成字符串,所以我不能。因此,我想问一下是否可以将其转换为

str2 = b'Output file \xeb\xac\xb8\xed\x95\xad\xeb\xb6\x84\xec\x84\x9d.xlsx Created'

这里str2是一个bytes对象,我可以使用

轻松解码
str2.decode('utf-8')

获得最终结果:

'Output file 문항분석.xlsx Created'

4 个答案:

答案 0 :(得分:2)

您可以使用ast.literal_eval

>>> print(str1)
b'Output file \xeb\xac\xb8\xed\x95\xad\xeb\xb6\x84\xec\x84\x9d.xlsx Created'
>>> type(str1)
<class 'str'>

>>> from ast import literal_eval
>>> literal_eval(str1).decode('utf-8')
'Output file 문항분석.xlsx Created'

答案 1 :(得分:2)

根据您的注释中提到的SyntaxError,由于控制台中stdout设置为ascii的事实,在尝试打印时可能会遇到测试问题(您可能还会发现(您的控制台不支持您可能要打印的某些字符)。您可以尝试使用类似以下的方法将sys.stdout设置为utf-8并查看控制台将打印的内容(仅使用下面的字符串切片和encode来获取字节,而不是ast.literal_eval已经提出的方法):

import codecs
import sys

sys.stdout = codecs.getwriter('utf-8')(sys.stdout.buffer)

s = "b'Output file \xeb\xac\xb8\xed\x95\xad\xeb\xb6\x84\xec\x84\x9d.xlsx Created'"
b = s[2:-1].encode().decode('utf-8')

答案 2 :(得分:1)

最后我找到了一个答案,我使用一个函数将字符串转换为不编码的字节。给定字符串

str1 = "b'Output file \xeb\xac\xb8\xed\x95\xad\xeb\xb6\x84\xec\x84\x9d.xlsx Created'"

现在我只在其中获取实际的编码文本

str1[2:-1]

并将其传递给函数,该函数将字符串转换为字节而不对值进行编码

import struct
def rawbytes(s):
    """Convert a string to raw bytes without encoding"""
    outlist = []
    for cp in s:
        num = ord(cp)
        if num < 255:
            outlist.append(struct.pack('B', num))
        elif num < 65535:
            outlist.append(struct.pack('>H', num))
        else:
            b = (num & 0xFF0000) >> 16
            H = num & 0xFFFF
            outlist.append(struct.pack('>bH', b, H))
    return b''.join(outlist)

因此,调用该函数会将其转换为字节,然后将其解码

rawbytes(str1[2:-1]).decode('utf-8')

将给出正确的输出

'Output file 문항분석.xlsx Created'

答案 3 :(得分:1)

一种简单的方法是假定初始字符串的所有字符都在[0,256)范围内并映射到相同的Unicode值,这意味着它是Latin1编码的字符串。

那么转换就很简单了:

str1[2:-1].encode('Latin1').decode('utf8')