2

我想在python中连接一些字符串(波斯字符串) :

            for t in lstres:
            with conn:
                c = conn.cursor()   
                q="SELECT fa FROM words WHERE en ='"+t+"'"
                c.execute(q)
                lst=c.fetchall()

                if lst:
                    W.append(lst)
                else:
                    W.append(t)

        cnum=1
        for can in W:
            cnum=cnum*len(W)

        candida=Set()

        for ii in range(1,min(20,cnum)):
            candid=""
            for w in W:
                candid+=str(" "+random.choice (w)[0]).encode('utf-8')
            candida.add(candid)

但它说:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xd8 in position 1: ordinal not in  range(128)

问题是什么 ?

4

3 回答 3

1

Python 正在尝试从 unicode 字符串到 ASCII 编码字符串的隐式类型转换。从您发布的内容很难判断发生这种情况的位置,但最好确保您始终使用 unicode。为此,您需要u在所有字符串前面添加一个,如下所示:u"A unicode string"并始终使用unicode()而不是str().

Unicode 经常被英语语言程序员和教程所忽视,因为在英语中,您只需使用 ASCII 编码字符即可。不幸的是,世界其他地方为此受苦,因为大多数语言使用 ASCII 不支持的字符。查看 Python Unicode HOWTO以获取有关 Unicode 良好编程实践的一些指导可能会很有用。

我还发现这篇文章非常有用。

于 2012-09-13T16:23:06.890 回答
1

问题在这里:

for ii in range(1,min(20,cnum)):
   candid=""
   for w in W:
       candid+=str(" "+random.choice (w)[0]).encode('utf-8')
    candida.add(candid)

它应该是

for ii in range(1,min(20,cnum)):
    candid=u""
    for w in W:
        candid+=str(u" "+random.choice (w)[0]).encode('utf-8')
    candida.add(candid)

但这不是惯用的python

你应该做

for ii in range(1,min(20,cnum)):
     candida.add(u" ".join(random.choice (w)[0] for w in W))

此外,您的脚本中有一个潜在的 sql 注入

q="SELECT fa FROM words WHERE en ='"+t+"'"
c.execute(q)

你应该做

q="SELECT fa FROM words WHERE en =?"
c.execute(q, (t,))

(t,)是一个只有一个元素的元组

于 2012-09-13T17:46:27.703 回答
0

您需要将您的字符串声明为 Unicode :

u'Your string here éàèç×...'
于 2012-09-13T16:02:07.387 回答