从file/sqlite数据库读取unicode字符并在Python中使用

2024-05-16 08:19:24 发布

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

我有一个带有unicode字符的变量列表,其中一些是针对臭氧气体这样的化学物质:比如“O\u2083”。所有这些都存储在sqlite数据库中,该数据库用Python代码读取,以生成O3。但是,当我读的时候,我得到的是“O\\u2083”。sqlite数据库是使用包含字符串“O\u2083”的csv文件创建的。我知道\u2083不是作为unicode字符存储在sqlite数据库中,而是存储为6个unicode字符(即\,u,2,0,8,3)。在这种情况下,有什么方法可以识别unicode字符吗?现在解决这个问题的第一个选择是创建一个函数来识别字符集并替换为unicode字符。有没有类似的东西已经实施了?在


Tags: csv方法字符串代码数据库列表sqliteunicode
3条回答

如果有一个Unicode字符串,则解码该字节(7)。在

>>> s = 'O\u2083'
>>> len(s)
7
>>> s
'O\\u2083'
>>> print(s)
O\u2083
>>> u = s.decode('unicode-escape')
>>> len(u)
2
>>> u
u'O\u2083'
>>> print(u)
O₃

注意:用于打印字符的控制台/IDE需要使用支持字符的编码,否则打印时会得到一个UnicodeEncodeError。字体也必须支持符号。在

记住一切都是字节是很重要的。要将字节拉入对您有用的内容,您需要知道在拉入数据时使用了什么编码。有太多模棱两可的情况,无法通过分析数据来确定编码。当你把所有的数据都发送出去的时候。根据您使用的是python2.x还是3.x,您将对Unicode和Python有着截然不同的体验。在

但是,您可以尝试编码并对错误执行“替换”。例如,the_string.encode("utf-8","replace")将尝试编码为utf-8,并将问题替换为?。您也可以预先预测问题字符并提前替换它们,但这很快就会变得不可管理。查看^{}类以获得更多替换选项。在

SQLite允许您直接读/写Unicode文本。u'O\u2083'是两个字符u'O'和{}(你的问题有一个错误:'u\2083' != '\u2083')。在

I understand that u\2083 is not being stored in sqlite database as unicode character but as 6 unicode characters (which would be u,\,2,0,8,3)

不要混淆u'u\2083'u'\u2083':后者是单个字符,而前者是4个字符序列:u'u'u'\x10''\20'在Python中解释为八进制)、u'8'u'3'。在

如果您将单个Unicode字符u'\u2083'保存到SQLite数据库中,它将作为单个Unicode字符存储(只要抽象有效,数据库中Unicode的内部表示就不相关)。在

在Python2上,如果模块顶部没有from __future__ import unicode_literals,那么'abc'字符串文本将创建一个bytestring而不是Unicode字符串,在这种情况下,'u\2083'和{}都是字节的序列,而不是文本字符(\uxxxx在bytestrings中不被识别为Unicode转义序列)。在

相关问题 更多 >