Unicode、Python3和程序员之间的又一场战斗。解码字符串

2024-10-04 09:31:42 发布

您现在位置:Python中文网/ 问答频道 /正文

问题是将字节转换为unicode,而这些字节已经保存在字符串中。举个例子:

s1 = '\xd0\xb1\xd0\xb0'
s2 = b'\xd0\xb1\xd0\xb1'

print(s1)  #  Here is the problem: prints a trash (аб)
print(s2.decode('utf-8'))  #  Everything is OK, printing 'ба' (two cyrillic symbols)

我现在能解码多强?我不能在s1声明之前添加b'修饰符,因为s1可能来自互联网,所以我不能像声明s2那样声明s1。 我发现b'修饰符的工作方式类似于bytes()函数,但是当我试图调用它时:

s3 = bytes(s1, 'utf-8')

又有垃圾了:

print(s3.decode('utf-8'))  #  аб

所以问题是:我应该怎么处理s1,使它成为终端输出中的“ба”?你知道吗

我在谷歌上搜索了很多,但我发现的并不是我需要的。你知道吗

这就是我需要的:

s4 = SOME_WONDERFUL_MAGIC(s1)
print(s4)  #  Prints 'ба'

非常感谢所有能帮助我的人,请原谅我的英语不好。你知道吗

更新:哦,问题返回了。我希望第一个答案能对我有所帮助,但我发现:

s1 == '\xd0\xb1\xd0\xb0'  #  BUT
s1 != '\xd0\xb1\xd0\xb0'

我的意思是: 我使用“requests”包向Flask服务器发出POST请求。它回答我:

req = requests.post(hostName)
print(req.text)  #  b'testText'
#  BUT!
print(req.text[2:-1]  #  testText

这意味着testText的字节表示形式是字符串,如下所示:

s5 = "b'tumba'"

所以真正的问题是:如何从“b'tumba”中提取tumba(如果tumba可能包含西里尔文符号)?你知道吗


Tags: 字符串声明字节isrequtfprintdecode
2条回答

s1可能被错误地解码为某处的ISO-8859-1(latin1)。你知道吗

你可以重新编码

>>> s4 = s1.encode('ISO-8859-1')
>>> s4.decode('UTF-8')
'ба'

你真正的错误是找到解码发生的地方。你知道吗

停止互换处理unicode和字节,战斗就会停止:)

对我有效的快速而肮脏的解决方案:

s1 = '\xd0\xb1\xd0\xb0'
s4 = bytes(s1, encoding='latin1').decode('utf-8')
print(s4)

相关问题 更多 >