如何在Python中解码ascii

Rob*_*rto 5 python django encoding ascii

我将西里尔字母从邮递员发送到 django 作为 url 中的参数,并得到类似%D0%B7%D0%B2in 变量search_text

\n\n

实际上,如果要打印,search_text我会得到类似\xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82打印的东西

\n\n

我尝试在控制台中执行以下操作,但没有收到错误

\n\n
>>> a = "\xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82"\n>>> a\n\'\\xd1\\x82\\xd0\\xb5\\xd0\\xba\\xd1\\x81\\xd1\\x82\'\n>>> print a\n\xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\n>>> b = a.decode("utf-8")\n>>> b\nu\'\\u0442\\u0435\\u043a\\u0441\\u0442\'\n>>> print b\n\xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82\n>>>\n
Run Code Online (Sandbox Code Playgroud)\n\n

通过没有控制台我确实有一个错误:

\n\n
"""WHERE title LIKE \'%%{}%%\' limit \'{}\';""".format(search_text, limit))\nUnicodeEncodeError: \'ascii\' codec can\'t encode characters in position 0-1: ordinal not in range(128)\n
Run Code Online (Sandbox Code Playgroud)\n\n

如何预防呢?

\n

Nik*_*ita 3

要解码 urlencoded 字符串(带有“%”符号),请使用urllib

\n\n
import urllib\nbyte_string=urllib.unquote(\'%D0%B7%D0%B2\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后你需要使用decodebyte_string的原始编码,即:

\n\n
import urllib\nimport codecs\nbyte_string=urllib.unquote(\'%D0%B7%D0%B2\')\nunicode_string=codecs.decode(byte_string, \'utf-8\')\n
Run Code Online (Sandbox Code Playgroud)\n\n

并将print(unicode_string)打印\xd0\xb7\xd0\xb2.

\n\n

问题在于未知的编码。您必须知道您获得的数据使用什么编码。要指定脚本 .py 文件中使用的默认编码,请将以下行放在顶部:

\n\n
# -*- coding: utf-8 -*-\n
Run Code Online (Sandbox Code Playgroud)\n\n

西里尔字母可能是“cp866”、“cp1251”、“koi8_r”和“utf-8”,这是最常见的。所以使用时decode尝试一下这些。

\n\n

Python 2 默认情况下不使用 unicode,因此最好启用它或切换到 Python 3。要在 .py 文件中启用 unicode,请将以下行放在所有导入的顶部:

\n\n
from __future__ import unicode_literals\n
Run Code Online (Sandbox Code Playgroud)\n\n

因此,在 Python 2.7.9 中,以下代码可以正常工作:

\n\n
# -*- coding: utf-8 -*-\nfrom __future__ import unicode_literals\n\na="\xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82"\nc="""WHERE title LIKE \'%%{}%%\' limit \'{}\';""".format(a, \'10\')\nprint(c)\n
Run Code Online (Sandbox Code Playgroud)\n\n

另请参阅:

\n\n

https://docs.python.org/2/library/codecs.html

\n\n

https://docs.python.org/2/howto/unicode.html

\n