转换显示对象的unicode字符串,在终端上使用

2024-04-26 00:14:14 发布

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

我想转换字符串u'Eichst\xe4tt-Landershofen',以便在终端上打印对象station。在

import json

class Station(object):
    def __init__(self,id, name, latitude, longitude):
        self._id = id
        self._name = name
        self._latitude = latitude
        self._longitude = longitude
        ....
    def get_name(self):
        return self._name

    def __repr__(self):
        return '<object=%s - id=%s, name=%s, latitude=%s, longitude=%s>' \
        % (self.__class__.__name__, self._id, self._name, self._latitude,\
            self._longitude)

如果我调用对象的get_name()函数station,一切正常。但是,如果我试图用函数__repr__打印整个对象,就会出现以下错误:

^{pr2}$

字符串u'Eichst\xe4tt-Landershofen'正被一个具有encoding='ISO-8859-1'的文件读取。在


Tags: 对象字符串nameselfidgetobjectdef
1条回答
网友
1楼 · 发布于 2024-04-26 00:14:14

首先,我建议不要在第一时间使用__repr__来表示这个对象,它实际上并不是要作为一个人类可读的对象表示。为此,您应该查找__str____format__,和/或{}。在

现在,您的问题是__repr__返回一个unicode对象。这是因为当您使用字符串替换'<name %s>' % _name和{}绑定到unicode对象时,python2会自动将bytestring模板“升级”为unicode,以实现替换。在

现在,在看到repr返回的unicode对象时,python将尝试通过使用sys.getdefaultencoding()对其进行编码来获得一个bytes对象,这显然是“ascii”的,但由于无法使用ascii字符集对工作站进行编码,因此失败了。在

如果您绝对希望repr中包含非ascii字符(为什么??)你必须选择一个你的终端能理解的编码,并编码到那个字符集。下面是一个utf-8的示例,它可能会在您的系统上运行:

import json

class Station(object):
    def __init__(self,id, name, latitude, longitude):
        self._id = id
        self._name = name
        self._latitude = latitude
        self._longitude = longitude

    def get_name(self):
        return self._name

    def __unicode__(self):
        return u'<object={} - id={}, name={}, latitude={}, longitude={}>'.format(
            self.__class__.__name__, 
            self._id, 
            self.get_name(), 
            self._latitude,
            self._longitude,
        )

    def __repr__(self):
        return unicode(self).encode('utf8')

相关问题 更多 >