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