【问题标题】:Python convert and save unicode string to a listPython将unicode字符串转换并保存到列表
【发布时间】:2011-10-14 15:15:40
【问题描述】:

我需要将一系列名称(如“Alam\xc3\xa9”)插入到列表中,然后将它们保存到 SQLite 数据库中。

我知道我可以通过打赏正确呈现这些名称:

print eval(repr(NAME)).decode("utf-8")

但我必须将它们插入到列表中,所以我不能使用 print

没有打印的其他方法?

【问题讨论】:

  • 您是否要在数据库中存储字节或字符?

标签: python unicode utf-8


【解决方案1】:

这里有很多很多的误解。

您引用的字符串不是 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é

如您所见,使用名称的原始非解码版本,reprprint 再次显示代码和字符。因此,并不是将其转换为 Unicode 实际上就使其更加“真正”成为正确的字符。

那么,如果你想将它存储在数据库中怎么办?没有什么。什么都没有。 Sqlite 接受 UTF-8 输入,并将其数据以 UTF-8 格式存储在磁盘上。因此,在数据库中存储name 的原始值绝对不需要转换。

【讨论】:

  • 非常感谢...现在我明白了一点... 最后一件事:现在一切正常,但只有一个例外:\u00f2 按原样打印,而不是ò。你知道为什么吗?
【解决方案2】:

你在寻找这样的东西吗?

[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 在它之前
  • print 语句只是试图显示 unicode 字符,而 repr() 没有(在 Python 2 中)。 u'\x39' 就是字符 é 在 repr 中的出现方式。这就是您要保存的内容。
猜你喜欢
  • 2012-03-22
  • 1970-01-01
  • 2015-09-18
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-30
相关资源
最近更新 更多