Python和希伯来语编码/解码错误

Python和希伯来语编码/解码错误,python,sqlite,unicode,encoding,hebrew,Python,Sqlite,Unicode,Encoding,Hebrew,我有一个sqlite数据库,我想在其中插入希伯来语的值 我不断收到以下错误: UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 0: ordinal not in range(128) 我的代码如下: runsql(u’插入到个人 值(%(ID)d,%(名称)s)%) {'ID':1,'name':编造\u希伯来语\u name()}) 注意:runsql在sqlite数据库上执行查询 make\u heb

我有一个sqlite数据库,我想在其中插入希伯来语的值

我不断收到以下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xd7 in position 0: ordinal
not in range(128)
我的代码如下:

runsql(u’插入到个人 值(%(ID)d,%(名称)s)%) {'ID':1,'name':编造\u希伯来语\u name()})

注意:
runsql
在sqlite数据库上执行查询
make\u hebrew\u name()
应该返回一个可以在我的SQL查询中使用的字符串。
非常感谢您的帮助。

您不应该手动编码,也不应该。

您正在将虚构的名称传递到Unicode字符串的字符串格式参数中。理想情况下,通过这种方式传递的字符串也应该是Unicode

但是编造希伯来名称并没有返回Unicode,而是返回UTF-8编码的字符串,这是不同的

所以,不要再调用encode('utf-8'),看看这是否有帮助

下一个问题是runsql应该是什么类型。如果需要Unicode,则没有问题。如果它需要ASCII编码的字符串,那么您将遇到问题,因为希伯来语不是ASCII。在不太可能的情况下,它期望一个UTF-8编码的字符串,那么这就是转换它的时间-在替换完成之后

在另一个答案中,Ignacio Vazquez Abrams警告查询中不要使用字符串插值。这里的概念是,与使用%运算符进行字符串替换不同,您通常应该使用参数化查询,并将希伯来语字符串作为参数传递给它。这在查询优化和针对SQL注入的安全性方面可能有一些优势

例子
使用
return random.choice(希伯来语名称)
嘿,谢谢你的回答,它帮了我很多忙,我的问题现在解决了:)另外,我对这种希伯来语字符串类型的概念有了更多的了解。谢谢,J.F.我觉得你和伊格纳西奥应该在这里得到最大份额的代表。
    def fabricate_hebrew_name():
        hebrew_names = [u'ירדן',u'יפה',u'תמי',u'ענת',u'רבקה',u'טלי',u'גינה',u'דנה',u'ימית',u'אלונה',u'אילן',u'אדם',u'חווה']
        return random.sample(names,1)[0].encode('utf-8')
# -*- coding: utf-8 -*-
import sqlite3

# create db in memory
conn = sqlite3.connect(":memory:")
cur = conn.cursor()
cur.execute("CREATE TABLE personal ("
            "id INTEGER PRIMARY KEY,"
            "name VARCHAR(42) NOT NULL)")

# insert random name
import random
fabricate_hebrew_name = lambda: random.choice([
    u'ירדן',u'יפה',u'תמי',u'ענת', u'רבקה',u'טלי',u'גינה',u'דנה',u'ימית',
    u'אלונה',u'אילן',u'אדם',u'חווה'])

cur.execute("INSERT INTO personal VALUES("
            "NULL, :name)", dict(name=fabricate_hebrew_name()))
conn.commit()

id, name = cur.execute("SELECT * FROM personal").fetchone()
print id, name
# -> 1 אלונה