【问题标题】:convert strings in separate lists to unicode - python将单独列表中的字符串转换为 unicode - python
【发布时间】:2013-08-11 22:20:36
【问题描述】:

在python中将列表(包含其他列表)中的每个字符串转换为unicode的最佳方法是什么?

例如:

[['a','b'], ['c','d']]

[[u'a', u'b'], [u'c', u'd']]

【问题讨论】:

  • 你的列表是否总是一个字符串列表,或者嵌套是任意的?
  • 这个问题有两半。首先,有“如何将字符串转换为 Unicode”。如果您认为这不是一个真正的问题,那么您肯定需要阅读 Horner6 的回答。其次,“假设我知道我想如何将每个字符串转换为 Unicode,我如何将它映射到这个数据结构中”。如果这是您要问的唯一部分,那么显示您希望如何转换每个字符串会更清楚。
  • @Peter DeGlopper:是的,它总是一个字符串列表
  • @user2635863 在 python 中,字符串是字节数组。在将它们“解码”为 Unicode 结构之前,您需要知道它们是哪种编码。
  • 我想使用非英文字符,所以我想将所有内容都转换为 unicode。

标签: python list unicode


【解决方案1】:
>>> li = [['a','b'], ['c','d']]

>>> [[v.decode("UTF-8") for v in elem] for elem in li]
[[u'a', u'b'], [u'c', u'd']]

【讨论】:

  • 我认为在添加“with unicode() function”部分之前会更好。这几乎总是错误的做法,而您最初的答案非常简单且近乎完美。
  • @abarnert。你能再解释一下吗?两者有区别吗?
  • 我的理解是unicode构造函数隐式解码。我很想知道是否也有区别。
  • 您的第一次编辑是unicode(v)。区别很明显:这是使用默认编码,通常是“ascii”,而且几乎总是错误的。您的第二次编辑将其更改为 unicode(v, "UTF-8"),它在功能上等同于 decode 调用 — 不太清晰,与 3.x 未来不兼容,但实际上并不糟糕。但我正在回复第一次编辑。
  • @abarnert。是的,我读到unicode() 不在3.x 中,所以将其删除。但是,也许我会添加它并记下它。
【解决方案2】:
>>> l = [['a','b'], ['c','d']]
>>> map(lambda x: map(unicode, x), l)
[[u'a', u'b'], [u'c', u'd']]

【讨论】:

  • 这是个坏主意,除非 OP 真的想用sys.getdefaultencoding() 解码。并且修复它以采用编码意味着 lambda 内部的 lambda 或 lambda 内部的部分;无论哪种方式,我认为在这里使用理解要简单得多。
  • 感谢您的澄清。如果 OP 想使用sys.getdefaultencoding(),我会把它留在这里,它看起来不错而且清晰。
【解决方案3】:

不幸的是,Unicode 没有一个简单的答案。但幸运的是,一旦你理解了它,它就会随身携带到其他编程语言。

这是迄今为止我见过的关于 python unicode 的最佳资源:

http://nedbatchelder.com/text/unipain/unipain.html

使用箭头键(在键盘上)导航到下一张和上一张幻灯片。

另外,请看一下这个(以及幻灯片末尾的其他链接)。

http://www.joelonsoftware.com/articles/Unicode.html

【讨论】:

  • 如果字符串是“Windows-1252”编码的字节字符串怎么办?通过猜测它们是 UTF-8 来解码对他没有帮助。唯一有帮助的是对文本编码有基本的了解,这样他就可以管理输入并产生预期的结果。
  • @PeterDeGlopper:你们两个刚刚做出了不同的猜测,这个问题的哪一半是 OP 曾经(或应该)询问的困难部分。在我们从 OP 那里得到一些澄清之前,可能没有太多争论的意义。
  • 好吧,基本上我只想在每个字符串之前添加“u”字母,这样我就可以使用非英文字符。据我所知,UTF-8 是我应该使用的字符集。
  • @user2635863:你所说的方式强烈暗示你应该去阅读那组幻灯片。 (对不起,我想不出一个适合发展受阻/流行流行笑话的方法……)
  • 另外,您需要了解字符串值和字符串文字/显示之间的区别。将u 添加到字符串“abc”的开头只会给您字符串“uabc”;它不会给你 unicode 字符串 u"abc"。 u 和引号一样不是字符串的一部分。
猜你喜欢
  • 2021-10-07
  • 2012-03-22
  • 1970-01-01
  • 2015-09-18
  • 2010-11-02
  • 2014-06-29
  • 1970-01-01
  • 1970-01-01
  • 2013-08-18
相关资源
最近更新 更多