Rob*_*rto 5 python django encoding ascii
我将西里尔字母从邮递员发送到 django 作为 url 中的参数,并得到类似%D0%B7%D0%B2in 变量search_text
实际上,如果要打印,search_text我会得到类似\xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82打印的东西
我尝试在控制台中执行以下操作,但没有收到错误
\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>>>\nRun 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)\nRun Code Online (Sandbox Code Playgroud)\n\n如何预防呢?
\n要解码 urlencoded 字符串(带有“%”符号),请使用urllib:
\n\nimport urllib\nbyte_string=urllib.unquote(\'%D0%B7%D0%B2\')\nRun Code Online (Sandbox Code Playgroud)\n\n然后你需要使用decode它byte_string的原始编码,即:
import urllib\nimport codecs\nbyte_string=urllib.unquote(\'%D0%B7%D0%B2\')\nunicode_string=codecs.decode(byte_string, \'utf-8\')\nRun Code Online (Sandbox Code Playgroud)\n\n并将print(unicode_string)打印\xd0\xb7\xd0\xb2.
问题在于未知的编码。您必须知道您获得的数据使用什么编码。要指定脚本 .py 文件中使用的默认编码,请将以下行放在顶部:
\n\n# -*- coding: utf-8 -*-\nRun Code Online (Sandbox Code Playgroud)\n\n西里尔字母可能是“cp866”、“cp1251”、“koi8_r”和“utf-8”,这是最常见的。所以使用时decode尝试一下这些。
Python 2 默认情况下不使用 unicode,因此最好启用它或切换到 Python 3。要在 .py 文件中启用 unicode,请将以下行放在所有导入的顶部:
\n\nfrom __future__ import unicode_literals\nRun 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)\nRun Code Online (Sandbox Code Playgroud)\n\n另请参阅:
\n\nhttps://docs.python.org/2/library/codecs.html
\n\nhttps://docs.python.org/2/howto/unicode.html。
\n| 归档时间: |
|
| 查看次数: |
5734 次 |
| 最近记录: |