Python 3 打印 UTF-8 编码字符串问题

4
我正在从网络服务请求一个字符串。在程序中打印它时:
variable = getFromNetwork()
print(variable)

当我使用python3 net.py执行它时,会得到:

\xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612

当我在Python3的CLI中执行时:
>>> print("\xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612")
تÙ
Ù
Ù612

当我在Python2 CLI中执行时,我得到了正确的结果:

>>> print("\xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612")
تملي612

我可以如何用Python3编写程序打印此内容?

编辑

执行以下代码后:

print(print(type(variable), repr(variable)))

收到

<class 'str'> '\\xd8\\xaa\\xd9\\x85\\xd9\\x84\\xd9\\x8a612'

我认为应该先移除\\x,将其转换为十六进制,然后进行解码。你有什么其他解决方案吗?


print(b"\xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612".decode('utf-8')) - Maurice Meyer
print(variable)实际上会输出 \xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612"\xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612" 还是 b"\xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612"? - MisterMiyagi
这只是 '@MisterMiyagi' 后面的 \xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612 - user10734089
1
请提供“print(type(variable), repr(variable))”的输出。 - MisterMiyagi
1
值得一提的是,虽然我们可以帮助“修复”问题(请参见Serge Ballesta的答案),但实际问题在于“getFromNetwork”已经损坏。它应该*提供未解码的字节或正确解码的字符串。目前,它提供了一个不正确解码的字符串。 - MisterMiyagi
显示剩余3条评论
3个回答

3
你需要指定编码,这样解释器才知道如何解释数据:
s = "\xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612"
y = s.encode('raw_unicode_escape')
print (y)  # is a bytes object now!
print (y.decode('utf-8'))

Out:

b'\xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612'
تملي612

我尝试了你的解决方案,得到了b'\\xd8\\xaa\\xd9\\x85\\xd9\\x84\\xd9\\x8a612'\xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612作为结果! - user10734089
Python 3.8.2(默认,2020年4月27日,15:53:34) - user10734089
请按照MisterMiyagi的指示正确调试变量。 - Maurice Meyer
2
修复创建“stockInfo”的任何问题,不应该有双反斜杠。 - Maurice Meyer
@Fastask:请开一个新问题,并详细描述getFromNetwork正在做什么。这里提供的信息不足以正确回答您的问题。 - Maurice Meyer
显示剩余3条评论

2

您的变量是一个包含UTF8编码字节字符串代码的(unicode)字符串。这可能是因为它被错误地解码为错误的编码(这里可能是Latin1)。

您可以通过首先将其转换为字节字符串而不更改代码(因此使用Latin1编码),然后才能正确解码来修复它:

variable = getFromNetwork().encode('Latin1').decode()
print(variable)

演示:

variable = "\xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612"
print(variable.encode('Latin1').decode())

تملي612

0

我在 Python 3 中使用以下代码进行了测试

    line='\xd8\xaa\xd9\x85\xd9\x84\xd9\x8a612'
    line = line.encode('raw_unicode_escape')
    line=line.decode("utf-8")
    print(line)

打印它

تملي612

b 是 Python3 中创建字节串的语法。您不需要事先声明一个变量来保存字节串。请单击编辑并添加您要尝试做什么的问题。或者开一个新问题。 - MadMike

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接