如何在python中解码ascii

时间:2016-02-13 17:51:54

标签: python django encoding ascii

我将邮递员发送给django的西里尔字母作为网址中的参数,并在变量%D0%B7%D0%B2

中获得search_text之类的内容

实际上,如果要打印search_text,我会得到类似текст打印的内容

我已尝试在控制台中进行以下操作并且没有收到错误

>>> a = "текст"
>>> a
'\xd1\x82\xd0\xb5\xd0\xba\xd1\x81\xd1\x82'
>>> print a
текст
>>> b = a.decode("utf-8")
>>> b
u'\u0442\u0435\u043a\u0441\u0442'
>>> print b
текст
>>>

没有控制台我确实有错误:

"""WHERE title LIKE '%%{}%%' limit '{}';""".format(search_text, limit))
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

如何预防?

3 个答案:

答案 0 :(得分:3)

要解码urlencoded字符串(使用'%'标志),请使用urllib

import urllib
byte_string=urllib.unquote('%D0%B7%D0%B2')

然后您需要decode来自byte_string的原始编码,即:

import urllib
import codecs
byte_string=urllib.unquote('%D0%B7%D0%B2')
unicode_string=codecs.decode(byte_string, 'utf-8')

print(unicode_string)将打印зв

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

# -*- coding: utf-8 -*-

西里尔字母可能是' cp866',' cp1251',' koi8_r'和' utf-8',这是最常见的。因此,在使用decode时请尝试这些。

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

from __future__ import unicode_literals

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

# -*- coding: utf-8 -*-
from __future__ import unicode_literals

a="текст"
c="""WHERE title LIKE '%%{}%%' limit '{}';""".format(a, '10')
print(c)

另见:

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

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

答案 1 :(得分:2)

它取决于django程序所期望的编码和字符串search_text, limit。通常它足以做到这一点:

"""WHERE title LIKE '%%{}%%' limit '{}';""".decode("utf-8").format(search_text.decode("utf-8"), limit)

编辑**阅读完修改后,您似乎无法将已删除的文本更改为字符串。下面是一个如何做到这一点的例子:

import urlparse
print urlparse.urlunparse(urlparse.urlparse("ресторан"))

答案 2 :(得分:1)

您可以使用'{}'.format(search_text.encode('utf-8')))将字符串解释为utf-8,但它可能会将您的西里尔字母显示为\xd0

阅读The Absolute Minimum Every Software Developer Must Know About Unicode and Character Sets