Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
对Python3中的unicode/字符串编码感到好奇_Python_Sqlite_Python 3.x - Fatal编程技术网

对Python3中的unicode/字符串编码感到好奇

对Python3中的unicode/字符串编码感到好奇,python,sqlite,python-3.x,Python,Sqlite,Python 3.x,我想问,为什么我在痛苦的几个小时的阅读/试图理解后发现一些东西能起作用,而最终只是成功的尝试和错误 我使用Linux(Ubuntu13.04,德语时间格式等,但使用英语系统语言)。我的小python 3脚本连接到引用管理器Zotero的sqlite3数据库。在这里,我阅读了几个关键点,目的是从zotero存储目录导出文件(可能不重要,如上所述,它可以正常工作) 所有这些都适用于ascii集合中的字符,但当然数据库中有很多国际作者,我的代码在非ascii作者/论文标题上常常失败。 也许首先在命令行

我想问,为什么我在痛苦的几个小时的阅读/试图理解后发现一些东西能起作用,而最终只是成功的尝试和错误

我使用Linux(Ubuntu13.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
正确的名称应该是“存储:Müller Forrell”;Zotero本身能够正确地解码,但SQLIte不能(至少dos不能在我的终端中正确地输出它)

谷歌告诉我,“ü”是一个不正确或未解码的拉丁语-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
s。我们在其上运行
encode()
将其转换为
字节
,然后将其解码回
str
。听起来数据库中的数据是错误编码的。

光标产生
str
s。我们在其上运行
encode()
将其转换为
字节
,然后将其解码回
str
。听起来数据库中的数据是错误编码的。

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

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

它们本来不应该作为拉丁语-1存储在db中


您正在执行解码前的编码。

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

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

它们本来不应该作为拉丁语-1存储在db中


您正在执行解码前的编码。

Hm,好的,print(pdf_result[2].encode(“拉丁语-1”))给了我b'storage:M\xc3\xbcller-Forell_2008\u Orbitatumoren.pdf',所以这将是一个utf-8编码的字节字符串,对吗?(\xc3\xbc表示“ü”)。但我把它编码成拉丁语-1,还是没有?在拉丁语中,1“ü”应该是小数点252。还是不明白…字符串在写入数据库时已从拉丁语-1转换为UTF-8两次。感谢您帮助我澄清问题!JHm,好的,print(pdf_result[2].encode(“拉丁语-1”)给了我b'storage:M\xc3\xbcller-Forell_2008\u Orbitatumoren.pdf',所以这是一个utf-8编码的字节字符串,对吗?(\xc3\xbc表示“ü”)。但我把它编码成拉丁语-1,还是没有?在拉丁语中,1“ü”应该是小数点252。还是不明白…字符串在写入数据库时已从拉丁语-1转换为UTF-8两次。感谢您帮助我澄清问题!汉克斯,我想我现在明白了!我想知道我怎么会在一开始就注意到这一点,也许有经验的程序员会第一眼就发现这一点。再次谢谢你,乔斯特谢谢,我想我现在明白了!我想知道我怎么会在一开始就注意到这一点,也许有经验的程序员会第一眼就发现这一点。再次感谢,JoostEven下面列出了解决方案,这里有一些问题。也就是说,将文件名解码为utf-8可以打印与存储在文件系统中的文件名相同但仍然不同的文件名。为了解决这个问题,在python3中,我在比较数据库返回的字符串和文件系统返回的字符串之前应用了以下函数:
import unicodedata
,然后使用
unicodedata.normalize('NFKD',s)
。请参阅。即使使用下面列出的解决方案,也存在一些问题。也就是说,将文件名解码为utf-8可以打印与存储在文件系统中的文件名相同但仍然不同的文件名。为了解决这个问题,在python3中,我在比较数据库返回的字符串和文件系统返回的字符串之前应用了以下函数:
import unicodedata
,然后使用
unicodedata.normalize('NFKD',s)
。看见