【发布时间】:2011-10-14 15:15:40
【问题描述】:
我需要将一系列名称(如“Alam\xc3\xa9”)插入到列表中,然后将它们保存到 SQLite 数据库中。
我知道我可以通过打赏正确呈现这些名称:
print eval(repr(NAME)).decode("utf-8")
但我必须将它们插入到列表中,所以我不能使用 print
没有打印的其他方法?
【问题讨论】:
-
您是否要在数据库中存储字节或字符?
我需要将一系列名称(如“Alam\xc3\xa9”)插入到列表中,然后将它们保存到 SQLite 数据库中。
我知道我可以通过打赏正确呈现这些名称:
print eval(repr(NAME)).decode("utf-8")
但我必须将它们插入到列表中,所以我不能使用 print
没有打印的其他方法?
【问题讨论】:
这里有很多很多的误解。
您引用的字符串不是 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 的原始值绝对不需要转换。
【讨论】:
\u00f2 按原样打印,而不是ò。你知道为什么吗?
你在寻找这样的东西吗?
[n.decode("utf-8") for n in ['Alam\xc3\xa9', 'Alam\xc3\xa9', 'Alam\xc3\xa9']]
【讨论】:
eval(repr('Alam\xc3\xa9')).decode("utf-8") 会产生相同的结果。你想做什么?
eval(repr('Alam\xc3\xa9')).decode("utf-8") 也是不正确的......诀窍是由 print 在它之前
u'\x39' 就是字符 é 在 repr 中的出现方式。这就是您要保存的内容。