我想问一下,为什么我在苦读/试图理解之后发现的一些东西是有效的,最终只是成功地尝试和错误。。。在
我用的是Linux(Ubuntu13.04,德语时间格式等等,但是是英语系统语言)。我的小python3脚本连接到引用管理器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
典型的问题条目:
^{pr2}$正确的名字应该是“储存量:Müller-Forrell”Zotero本身可以正确地解码,但是SQLIte没有(至少在我的终端上没有正确地输出它)。在
Google告诉我“ü”是一个不知何故错误或没有解码的拉丁语-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
,第二个是正确的,所以我让我的脚本工作(天哪,这花了我多少小时…)
有人能给我解释一下。编码和解码的结构是什么?哪一个先被处死? 谢谢你的任何线索
乔斯特
游标生成
str
s。我们在它上运行encode()
,将其转换为bytes
,然后将其解码回str
。听起来数据库中的数据编码错误。在这里您看到的是存储在SQLite数据库中的用拉丁语1编码的UTF8数据。在
sqlite模块总是返回unicode字符串,因此您首先必须将它们编码为拉丁语-1的unicode等价物,然后将它们解码为UTF8。在
它们一开始不应该作为拉丁语-1存储在数据库中。在
您正在执行“先编码后解码”。在
相关问题 更多 >
编程相关推荐