如何在Python中将UTF-8字符串列表输出为原样?

4

嗯,字符编码和解码有时让我很沮丧。

所以我们知道u'\u4f60\u597d'utf-8编码的你好

>>> print hellolist
[u'\u4f60\u597d']
>>> print hellolist[0]
你好

现在我真正想要的输出结果或写入文件的内容是[u'你好'],但一直都是[u'\u4f60\u597d'],那么如何处理呢?

4个回答

5
你有误解。
在Python中,u''不是utf-8,而仅仅是Unicode(除了在Python <= 3.2的Windows版本中,它是utf-16)。 utf-8是Unicode的一种编码,必然是一系列bytes
此外,u'你'u'\u4f60'是完全相同的。只是在Python2中,高字符的repr使用转义而不是原始值。
由于Python2即将面临EOL,你应该认真考虑转向Python3。在Python3中,跟踪所有这些内容要容易得多,因为只有一种字符串类型,并且当你使用.encode.decode时更加清晰。

说在某些平台和Python版本中u''是utf-16编码是无关紧要的 - 它在内部使用某种编码,但具体使用哪种编码是实现细节(而且您的细节有点错误:Unicode字符的内部表示方式曾经取决于解释器的编译方式;现在它取决于字符串中的字符)。但是对于u'你'u'\u4f60'是相同的事物加1分,这是重点 - 这些是打印相同对象的不同方式,两种拼写在所有情况下都将被Python相同地处理。 - lvc
@Ivc 请注意,当您打印列表时,u'\u4f60'会在打印或写入文件之前被打印/转换为u'\\u4f60',这就是OP所说的问题,这是由于列表内部使用repr()引起的。 - Anand S Kumar

4
当您打印(或写入文件)列表时,它内部调用列表的str()方法,但列表内部调用其元素的repr()repr()返回您看到的丑陋的Unicode表示形式。 repr的示例:
>>> h = u'\u4f60\u597d'
>>> print h
\u4f60\u597d
>>> print repr(h)
u'\u4f60\u597d'

你需要手动获取列表元素并打印它们,以便正确打印。
例如-
>>> h1 = [h,u'\u4f77\u587f']
>>> print u'[' + u','.join([u"'" + unicode(i) + u"'" for i in h1]) + u']'

对于包含可能具有Unicode字符的子列表的列表,您需要一个递归函数,例如 -

>>> h1 = [h,(u'\u4f77\u587f',)]
>>> def listprinter(l):
...     if isinstance(l, list):
...             return u'[' + u','.join([listprinter(i) for i in l]) + u']'
...     elif isinstance(l, tuple):
...             return u'(' + u','.join([listprinter(i) for i in l]) + u')'
...     elif isinstance(l, (str, unicode)):
...             return u"'" + unicode(l) + u"'"
... 
>>> 
>>> 
>>> print listprinter(h1)

要将它们保存到文件中,可以使用相同的列表推导式或递归函数。例如 -

with open('<filename>','w') as f:
    f.write(listprinter(l))

0
 with open("some_file.txt","wb") as f:
    f.write(hellolist[0].encode("utf8"))

我认为这将解决你的问题

大多数文本编辑器使用utf8编码 :)

虽然其他答案是正确的,但它们实际上没有解决你的问题

>>> u'\u4f60\u597d'.encode("utf8")
'\xe4\xbd\xa0\xe5\xa5\xbd'

如果你想要括号

>>> u'[u\u4f60\u597d,]'.encode("utf8")

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接