0

我想问一下为什么我在痛苦的数小时阅读/试图理解之后发现了一些有效的东西,最后只是成功地试错了......

我在 Linux 上(Ubuntu 13.04,德语时间格式等,但英语系统语言)。我的小型 python 3 脚本连接到参考管理器 Zotero 的 sqlite3 数据库。在那里我读了几个键,目的是从 zotero 存储目录中导出文件(可能不重要,如上所述,让它工作)。

所有这些都适用于 ascii 集中的字符,但当然数据库中有很多国际作者,而且我的代码过去常常在非 ascii 作者/论文标题上失败。也许首先是关于命令行 sqlite3 上的数据库的一些信息:

sqlite3 zotero-test.sqlite 
SQLite version 3.7.15.2 2013-01-09 11:53:05
sqlite> PRAGMA encoding;
UTF-8

示例性有问题的条目:

sqlite> select * from itemattachments;   
317|281|1|application/pdf|5|storage:Müller-Forell_2008_Orbitatumoren.pdf||2|1372357574000|2814ef3ea9c50cce2c32d6fb46b977bb

正确的名称是“storage:Müller-Forrell”;Zotero 本身可以正确解码,但 SQLIte 没有(至少在我的终端中没有正确输出)。

谷歌告诉我“ü”是一个不知何故不正确或未解码的 latin-1/8859-1“ü”。

从 python3 读取这个数据库条目

connection = sqlite3.connect("zotero-test.sqlite")`
cursor = connection.cursor()`
cursor.execute("SELECT itemattachments.itemID,itemattachments.sourceItemID,itemattachments.path,items.key FROM itemattachments,items WHERE mimetype=\"application/pdf\" AND items.itemID=itemattachments.itemID")

for pdf_result in cursor:
    print(pdf_result[2])
    print()
    print(pdf_result[2].encode("latin-1").decode("utf-8"))

给出:

storage:Müller-Forell_2008_Orbitatumoren.pdf

storage:Müller-Forell_2008_Orbitatumoren.pdf

,第二个是正确的,所以我的脚本工作了(天哪,这花了我多少小时......)

有人可以向我解释 .encode 和 .decode 的构造是做什么的吗?哪个是最先执行的?感谢您提供任何线索,

约斯特

4

2 回答 2

2

游标产生strs。我们在其上运行encode()以将其转换为 a bytes,然后将其解码回 a str。听起来数据库中的数据编码错误。

于 2013-07-03T20:25:50.797 回答
2

您在这里看到的是存储在 SQLite 数据库中的 latin-1 编码的 UTF8 数据。

sqlite 模块总是返回 unicode 字符串,因此您首先必须将它们编码为 latin-1 的 unicode 等价物,然后将它们解码为 UTF8。

一开始它们不应该作为 latin-1 存储在数据库中。

您在解码之前执行编码。

于 2013-07-03T20:30:38.400 回答