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

时间:2016-06-29 17:51:50

标签: python sqlite unicode

我有一个带有unicode字符的变量列表,其中一些用于臭氧气体等化学品:例如' O \ u2083'。所有这些都存储在一个sqlite数据库中,该数据库在Python代码中读取以生成O 3 。但是,当我读到的时候,我会得到这样的信息。 sqlite数据库是使用包含字符串' O \ u2083'的csv文件创建的。等等。据我所知,\ u2083不是作为unicode字符存储在sqlite数据库中,而是存储为6个unicode字符(将是\,u,2,0,8,3)。有没有办法在这种情况下识别unicode字符?现在我解决它的第一个选择是创建一个函数来识别字符集并替换unicode字符。有这样的事情已经实施了吗?

3 个答案:

答案 0 :(得分:1)

记住一切都是字节很重要。要将字节拉入对您有用的内容,您必须知道在引入数据时使用的编码。通过分析数据来确定编码的模糊情况太多了。当您从程序中发送数据时,它会再次返回到字节。根据您使用的是Python 2.x还是3.x,您将获得与Unicode和Python非常不同的体验。

但是,您可以尝试编码并简单地对错误进行“替换”。例如the_string.encode("utf-8","replace")将尝试编码为utf-8并将替换?的问题 - 您还可以预测问题字符并事先替换它们,但这很快就无法管理。查看codecs课程以获取更多替代选项。

答案 1 :(得分:1)

如果您有一个字节字符串(长度为7),请解码Unicode转义。

>>> 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。字体也必须支持该符号。

答案 2 :(得分:1)

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

  

据我所知,你没有将\ _2083存储在sqlite数据库中作为unicode字符,而是作为6个unicode字符存储(可能是u,\,2,0,8,3)

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

如果将单个Unicode字符u'3'保存到SQLite数据库中;它存储为单个Unicode字符(只要抽象成立,数据库内部Unicode的内部表示就无关紧要了。)

在Python 2上,如果模块顶部没有u'\u2083',则from __future__ import unicode_literals字符串文字会创建一个字节字符串而不是Unicode字符串 - 在这种情况下,'abc''u\2083' bytes 的序列,而不是文本字符('\u2083'未被识别为字节串内的unicode转义序列。)