对python3中的unicode/string编码好奇吗

2024-06-02 10:32:25 发布

您现在位置:Python中文网/ 问答频道 /正文

我想问一下,为什么我在苦读/试图理解之后发现的一些东西是有效的,最终只是成功地尝试和错误。。。在

我用的是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

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

有人能给我解释一下。编码和解码的结构是什么?哪一个先被处死? 谢谢你的任何线索

乔斯特


Tags: 数据库sqlitepdf错误itemsresult解码sqlite3
2条回答

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

这里您看到的是存储在SQLite数据库中的用拉丁语1编码的UTF8数据。在

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

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

您正在执行“先编码后解码”。在

相关问题 更多 >