我有一个字符串,其中包含编码的字节:
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'
答案 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')