编码不在列表上工作的字符?

时间:2014-10-11 16:27:02

标签: python list utf-8 character-encoding

我有一个列表:

print alist    
['G\xc3\xbcnther', 'Santher']

并希望将其更改为:

['Günther', 'Santher']

我尝试过很多东西:

alist=[s.encode("utf-8") for s in alist]
print alist
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc3 in position 1: ordinal not in range(128)

在其他人中,Günther这个词迷失了,或者G \ xc3 \ xbcnther保持不变。我做错了什么?

2 个答案:

答案 0 :(得分:2)

这里的一切正常,你只是从API中做错了。

打印字符串以外的对象,首先将其转换为字符串。在这种情况下,列表将转换为表示Python表达式的字符串,该字符串在输入时将评估为相等的列表。这是显示列表最有用的方法:您可以看到其中的确切内容,有时它只是被转义。

比较

>>> a = ['test\'test\"test', 0, '0']

>>> print a[0]
test'test"test

>>> print a
['test\'test"test', 0, '0']

字母ü以UTF-8编码为两个字节:\xc3\xbc。因此,如果您在UTF-8终端中打印字符串'G\xc3\xbcnther',您将看到Günther。如果将它保存到一个文件并在一个体面的文本编辑器中打开该文件,它将显示Günther(也许你必须稍微戳一下编码设置)。出于所有意图和目的,这是将“Günther”一词存储在字节串中的最佳方式。

如果您想以一种不错的方式打印列表,您可以自行格式化。例如,如果它是一个字符串列表,就像你的例子中一样,join会很好用:

>>> print '; '.join(['G\xc3\xbcnther', 'Santher'])
Günther; Santher

(顺便说一下:你不能对字节串进行编码,它已经编码了。但是你可以解码它。)

答案 1 :(得分:1)

您的代码会显示代表性表单,以便在字符串形式中使用此代码:

print alist[0]

python将unicode字符保存为相同,无法更改此内容:)