[英]Curious about unicode / string encoding in Python 3
我想問一問,為什么在經過數小時的閱讀/嘗試理解之后發現了某些有用的東西,但最終卻只能成功地反復嘗試...
我使用的是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不能(至少不會在我的終端中正確輸出)。
Google告訴我,“¼”是某種程度上不正確或未解碼的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的構造嗎? 哪一個先被執行? 感謝您提供任何線索,
Joost的
光標產生str
。 我們在其上運行encode()
將其轉換為bytes
,然后將其解碼回str
。 聽起來數據庫中的數據編碼錯誤。
您在這里看到的是存儲在SQLite數據庫中的latin-1編碼的UTF8數據。
sqlite模塊始終返回unicode字符串,因此您首先必須將它們編碼為等效於latin-1的unicode,然后將其解碼為UTF8。
首先,它們不應該以latin-1的形式存儲在數據庫中。
您正在執行編碼,然后再解碼。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.