将Python的3字节字符串转换为`str(utf8_encoded_str)`返回unicode

dar*_*ess 11 python string unicode

好吧,让我先介绍一下这个问题.

我通过POST/GET请求获得了一些数据.数据是UTF-8编码的字符串.我不知道这一点,只是通过str()方法转换它.现在我有完整的"无意义数据"数据库,无法找到回路.

示例代码:

unicode_str - 这是我应该获得的字符串

encoded_str - 这是我用POST/GET请求得到的字符串 - 初始数据

bad_str - 我目前在数据库中拥有的数据,我需要从中获取unicode.

显然我知道如何转换: unicode_str =(encode)=> encoded_str =(str)=> bad_str

但我无法提出解决方案: bad_str =(???)=> encoded_str =(decode)=> unicode_str

In [1]: unicode_str = 'P?íliš žlu?ou?ký k?? úp?l ?ábelské ódy'

In [2]: unicode_str
Out[2]: 'P?íliš žlu?ou?ký k?? úp?l ?ábelské ódy'

In [3]: encoded_str = unicode_str.encode("UTF-8")

In [4]: encoded_str
Out[4]: b'P\xc5\x99\xc3\xadli\xc5\xa1 \xc5\xbelu\xc5\xa5ou\xc4\x8dk\xc3\xbd k\xc5\xaf\xc5\x88 \xc3\xbap\xc4\x9bl \xc4\x8f\xc3\xa1belsk\xc3\xa9 \xc3\xb3dy'

In [5]: bad_str = str(encoded_str)

In [6]: bad_str
Out[6]: "b'P\\xc5\\x99\\xc3\\xadli\\xc5\\xa1 \\xc5\\xbelu\\xc5\\xa5ou\\xc4\\x8dk\\xc3\\xbd k\\xc5\\xaf\\xc5\\x88 \\xc3\\xbap\\xc4\\x9bl \\xc4\\x8f\\xc3\\xa1belsk\\xc3\\xa9 \\xc3\\xb3dy'"

In [7]: new_encoded_str = some_magical_function_here(bad_str) ???
Run Code Online (Sandbox Code Playgroud)

Ret*_*i43 12

您将一个bytes对象转换为一个字符串,它只是bytes对象的表示.您可以使用ast.literal_eval()(Mark Tolonen为建议的信用)获取原始字节对象,然后一个简单的decode()将完成工作.

>>> import ast
>>> ast.literal_eval(bad_str).decode('utf-8')
'P?íliš žlu?ou?ký k?? úp?l ?ábelské ódy'
Run Code Online (Sandbox Code Playgroud)

由于你是生成字符串的人,使用eval()是安全的,但为什么不安全呢?

  • @darkless你保存的字符串是什么样子并不重要.只要你按照获取utf-8字符串的过程 - >将它编码为一个字节对象 - >将**转换为字符串并存储到数据库,就可以保证这些字符串是无害的字节对象. (4认同)
  • `ast.literal_eval`在没有'eval`安全风险的情况下做同样的事情. (3认同)

Hon*_*rál 6

请不要使用 eval,而是:

import codecs
s = 'žlu?ou?ký'
x = str(s.encode('utf-8'))

# strip quotes
x = x[2:-1]

# unescape
x = codecs.escape_decode(x)[0].decode('utf-8')

# profit
x == s
Run Code Online (Sandbox Code Playgroud)