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

How to decode a string representation of a bytes object?

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

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'

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

根据您评论中提到的 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')

最后我找到了一个答案,我使用函数将字符串转换为没有 encoding.Given 字符串

的字节

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'

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

转换很简单:

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