2016-02-13 61 views
3

我得到了类似текст印刷如何在python

我解码ASCII我送从邮递员西里尔字母的Django作为URL参数和变量search_text

实际上得到类似%D0%B7%D0%B2如果打印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

你使用Python 2吗? – Nikita

+0

@Nikita是的。 2.7 – Roberto

+0

请看我更新的答案。 – Nikita

回答

3

为了解码urlencoded的字符串(以“%”标志)使用urllib

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

,然后你需要decodebyte_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文件放入以下行对所有进口的顶部:

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

+0

这有助于感谢,但我仍然有一个问题,当我使用'unicode_literals'并尝试使用'like%search_text%'查询时。这个查询以某种方式区分大小写,并且'Зв'和'зв'之间有区别。我试过用'LOWER(title)'或'UPPER(title)''LOWER(search_text)''但是没有帮助。可能你对这一点有什么想法?如何使西里尔大小写不敏感选择。 – Roberto

+0

@Roberto:这取决于数据库。可能在单独的问题(可能已经存在)中更好 – RemcoGerlich

+0

@Roberto,与'unicode_literals'无关。 'unicode_literals'只是在Python 2中创建字符串的行为就像是Python 3一样,默认情况下所有字符串都是unicode。区分大小写是针对数据库的,您可能想使用'ILIKE'而不是'LIKE',这是大小写无效的。 – Nikita

2

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

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

编辑**阅读您的编辑后,看来你有你的urlparsed文本变回成字符串问题。继承人如何做到这一点的例子:

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

这也会返回一个错误:'UnicodeEncodeError:'ascii '编解码器不能编码0-1位置的字符:序号不在范围内(128)' – Roberto

+0

你真的需要更清楚地使用search_text,limit和django所需的编码。尝试再次尝试此操作,我编辑了代码 – bmbigbang

+0

同样的错误:'return codecs.utf_8_decode(input,errors,True) UnicodeEncodeError:'ascii'编解码器无法对位置0-1中的字符进行编码:序号不在范围内(128) ' – Roberto