如何解码字节对象的字符串表示?
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')
我有一个字符串,其中包含编码字节:
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')