我想问一下为什么我在痛苦的数小时阅读/试图理解之后发现了一些有效的东西,最后只是成功地试错了......
我在 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 的构造是做什么的吗?哪个是最先执行的?感谢您提供任何线索,
约斯特