gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 13:53:21 24 4
gpt4 key购买 nike

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

我不断收到以下错误:

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

我的代码如下:

runsql(u'INSERT into personal values(%(ID)d,%(name)s)' % {'ID':1,'name':fabricate_hebrew_name()})

    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')

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

最佳答案

您将伪造的名称传递到 Unicode 字符串的字符串格式化参数中。理想情况下,以这种方式传递的字符串也应该是 Unicode。

但是 fabricate_hebrew_name 没有返回 Unicode - 它返回的是 UTF-8 编码的字符串,这是不一样的。

因此,摆脱对 encode('utf-8') 的调用,看看是否有帮助。

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

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

例子

# -*- 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 אלונה

关于Python 和希伯来语编码/解码错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2828537/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com