问题是当字节已经保存在字符串中时,将字节转换为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的数据呢?我不能在s1声明之前添加b“”修饰符,因为s1可能来自internet,所以我不能像声明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可能包含西里尔符号)?

最佳答案

s1可能在某个地方被错误地解码为ISO-8859-1(latin1)
你可以尝试重新编码

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

你真正的错误是找到解码发生的地方。
停止交替处理unicode和字节,战斗将停止:)

关于python - Unicode,Python 3和程序员之间的又一战。解码字符串,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20206814/

10-14 13:48