在终端上使用 __repr__ 转换显示对象的 unicode 字符串
convert unicode string for display object with __repr__ on terminal
我想转换字符串 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)
如果我调用对象 station
的 get_name()
函数,一切都很好。但是,如果我尝试使用函数 __repr__
打印整个对象,我会收到以下错误:
print station.Station(id, name, lat, long)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 38: ordinal not in range(128)
字符串 u'Eichst\xe4tt-Landershofen'
正在被具有 encoding='ISO-8859-1'
的文件读取。
首先,我建议首先不要为此使用 __repr__
- 它并不是真正打算成为对象的人类可读表示。为此,您应该查看 __str__
、__format__
、and/or __unicode__
。
现在,您的问题是 __repr__
正在返回一个 unicode 对象。这是因为当你使用字符串替换 '<name %s>' % _name
和 _name
绑定到一个 unicode 对象时, python 2 自动将 bytestring 模板 "promotes" 转换为 unicode 以实现替换。
现在,在看到从 repr 返回的 unicode 对象后,python 将尝试通过使用 sys.getdefaultencoding()
对其进行编码来取回字节对象,这显然是 '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')
我想转换字符串 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)
如果我调用对象 station
的 get_name()
函数,一切都很好。但是,如果我尝试使用函数 __repr__
打印整个对象,我会收到以下错误:
print station.Station(id, name, lat, long)
UnicodeEncodeError: 'ascii' codec can't encode character u'\xe4' in position 38: ordinal not in range(128)
字符串 u'Eichst\xe4tt-Landershofen'
正在被具有 encoding='ISO-8859-1'
的文件读取。
首先,我建议首先不要为此使用 __repr__
- 它并不是真正打算成为对象的人类可读表示。为此,您应该查看 __str__
、__format__
、and/or __unicode__
。
现在,您的问题是 __repr__
正在返回一个 unicode 对象。这是因为当你使用字符串替换 '<name %s>' % _name
和 _name
绑定到一个 unicode 对象时, python 2 自动将 bytestring 模板 "promotes" 转换为 unicode 以实现替换。
现在,在看到从 repr 返回的 unicode 对象后,python 将尝试通过使用 sys.getdefaultencoding()
对其进行编码来取回字节对象,这显然是 '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')