Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/319.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将Unicode-`str(utf8\u编码的\u str)`的Python 3字节字符串转换回Unicode_Python_String_Unicode - Fatal编程技术网

将Unicode-`str(utf8\u编码的\u str)`的Python 3字节字符串转换回Unicode

将Unicode-`str(utf8\u编码的\u str)`的Python 3字节字符串转换回Unicode,python,string,unicode,Python,String,Unicode,好吧,让我先介绍一下这个问题 我通过POST/GET请求获得了一些数据。数据为UTF-8编码字符串。我一点也不知道,只是通过str()方法转换了它。现在我有了完整的“无意义数据”数据库,找不到返回的方法 示例代码: unicode\u str-这是我应该获得的字符串 encoded_str-这是我通过POST/GET请求获得的字符串-初始数据 坏的\u str-我现在数据库中的数据,我需要从中获取unicode 显然我知道如何转换: unicode\u-str=(encode)=>encoded

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

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

示例代码: unicode\u str-这是我应该获得的字符串

encoded_str-这是我通过POST/GET请求获得的字符串-初始数据

坏的\u str-我现在数据库中的数据,我需要从中获取unicode

显然我知道如何转换: unicode\u-str=(
encode
)=>encoded\u-str=(
str
)=>bad\u-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) ???
但我想不出解决办法: 坏字符=(
)=>编码字符=(
解码
)=>unicode字符

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) ???

您将字节对象转换为字符串,该字符串只是字节对象的表示形式。您可以使用(credits to Mark Tolonen for the suggestion)获得原始bytes对象,然后一个简单的
decode()
将完成此工作

>>> import ast
>>> ast.literal_eval(bad_str).decode('utf-8')
'Příliš žluťoučký kůň úpěl ďábelské ódy'

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

请不要使用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

嗯,我也考虑了
eval
,但因为我不知道那里有什么数据,而且有很多数据,我希望我能回避这个问题,因此没有提及它。但是谢谢:)@darkless不管你保存的字符串是什么样子的。只要您遵循获取utf-8字符串->将其编码为字节对象->将其转换为字符串并存储到数据库中的过程,您就可以保证这些字符串是无害的字节对象。没错,我没有意识到每个存储的字符串都是“b'…”,eval应该将其解释为b'…:)谢谢您的评论
ast.literal_eval
做同样的事情,没有
eval
@darkless的安全风险。我只想提醒您注意,有一个更安全的
eval()
版本也符合您的要求。感谢非eval版本,我错过了将双斜杠变成单斜杠的
escape\u decode
。但是我找不到这种方法的文档:哇,这很好用。