我将邮递员发送给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)
如何预防?
答案 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)
另见:
答案 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。