簡體   English   中英

對Python 3中的unicode /字符串編碼感到好奇

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM