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エンコード文字列への暗黙的な型変換を行おうとしています。これがどこで起こっているかをあなたが投稿したものから見分けるのは難しいですが、とにかく常にユニコードを使用することを確認する方が良いです。これを行うには、次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,)要素が 1 つだけのタプルです

于 2012-09-13T17:46:27.703 に答える
0

文字列を Unicode として宣言する必要があります。

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