python 2和3中的UTF-8字符串

2024-05-23 23:21:03 发布

您现在位置:Python中文网/ 问答频道 /正文

以下代码适用于Python3:

people = [u'Nicholas Gyeney', u'Andr\xe9']
writers = ", ".join(people)
print(writers)
print("Writers: {}".format(writers))

并产生以下输出:

Nicholas Gyeney, André  
Writers: Nicholas Gyeney, André

但是,在Python2.7中,我得到了以下错误:

Traceback (most recent call last):
  File "python", line 4, in <module>
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' 
in position 21: ordinal not in range(128)

我可以通过将", ".join(people)更改为", ".join(people).encode('utf-8')来修复此错误,但如果这样做,Python 3中的输出将更改为:

b'Nicholas Gyeney, Andr\xc3\xa9'  
Writers: b'Nicholas Gyeney, Andr\xc3\xa9'

所以我尝试使用以下代码:

if sys.version_info < (3, 0):
    reload(sys)
    sys.setdefaultencoding('utf-8')

people = [u'Nicholas Gyeney', u'Andr\xe9']
writers = ", ".join(people)
print(writers)
print("Writers: {}".format(writers))

这使得我的代码可以在所有版本的Python中工作。但我是用setdefaultencodingis discouraged读的。

处理这个问题的最佳方法是什么?


Tags: 代码informat错误syspeopleencodeprint
2条回答

在Python2中,应该为joinprint使用unicode字符串:

people = [u'Nicholas Gyeney', u'Andr\xe9']
writers = u", ".join(people)
print(writers)
print(u"Writers: {}".format(writers))

格式化时可以提供Unicode前缀:

print(u"Writers: {}".format(writers))

这确实解决了这个问题,但是,您在Python 3脚本中添加了不必要的u''前缀。

在检查了版本之后,您也可以from __future__ import unicode_literals,但我不会这样做,使用它通常比较困难,而且由于u''前缀可以充分完成此工作,因此已被认为是不推荐的。

相关问题 更多 >