问题是当字节已经保存在字符串中时,将字节转换为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/