我需要在列表中插入一系列名称(如'Alam \ xc3 \ xa9'),而不是将它们保存到SQLite数据库中。
我知道我可以通过提示正确地呈现这些名称:
print eval(repr(NAME)).decode("utf-8")
但我必须将它们插入列表中,因此我无法使用打印
没有打印的其他方式吗?
答案 0 :(得分:6)
这里有很多误解。
您引用的字符串是不是 Unicode。它是一个字节字符串,以UTF-8编码。
您可以通过解码将其转换为Unicode:
unicode_name = name.decode('utf-8')
当您将unicode_name
的值打印到控制台时,您会看到以下两种情况之一:
>>> unicode_name
u'Alam\xe9'
>>> print unicode_name
Alamé
在这里,您可以看到只需键入名称并按Enter键即可显示Unicode代码点的表示形式。这与键入print repr(unicode_name)
相同。但是,执行print unicode_name
打印实际字符 - 即在幕后,它会将其编码为终端的正确编码,并打印结果。
但这一切都无关紧要,因为Unicode字符串只能在内部表示。只要您想将其存储在数据库,文件或任何地方,就需要对其进行编码。最有可能选择的编码是UTF-8 - 这就是最初的编码。
>>> name
'Alam\xc3\xa9'
>>> print name
Alamé
如您所见,使用名称的原始未解码版本repr
和print
再次显示代码和字符。因此,将它转换为Unicode实际上并不能使它“真正”成为正确的角色。
那么,如果要将其存储在数据库中该怎么办?没有。什么都没有。 Sqlite接受UTF-8输入,并将其数据以UTF-8格式存储在磁盘上。因此,绝对不需要转换来将name
的原始值存储在数据库中。
答案 1 :(得分:0)
你在找这样的东西吗?
[n.decode("utf-8") for n in ['Alam\xc3\xa9', 'Alam\xc3\xa9', 'Alam\xc3\xa9']]