【问题标题】:convert unicode string for display object with __repr__ on terminal在终端上使用 __repr__ 转换显示对象的 unicode 字符串
【发布时间】:2023-03-22 02:29:01
【问题描述】:

我想转换字符串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)

如果我调用对象stationget_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' 的文件读取。

【问题讨论】:

  • 添加.encode('iso-8859-1')会得到什么?
  • 我得到输出:&lt;object=Station - id=1161, name=Eichst�tt-Landershofen, latitude=48.8779, longitude=11.2347&gt;。是否可以将 � 转换为可读字符?
  • @BurhanKhalid:源文件iso-8859-1,但我们不知道终端选择了什么编码。希望是'utf-8'
  • 改为添加.encode('utf-8') 是否有效?顺便说一句,当您询问 Unicode 问题时,您应该始终添加 Python 版本标记,因为 Python 3 处理 Unicode 与 Python 2 完全不同。
  • 如果我将函数 get_name(self) 中的 self._name 更改为 self_name.encode('UTF-8'),我会得到与 .encode('iso-8859-1') 相同的输出。

标签: python unicode encoding character-encoding python-2.x


【解决方案1】:

首先,我首先建议不要为此使用__repr__ - 它并不是真正打算成为对象的人类可读表示。为此,您应该关注__str____format__ 和/或__unicode__

现在,您的问题是 __repr__ 正在返回一个 unicode 对象。这是因为当您使用字符串替换 '&lt;name %s&gt;' % _name 并且 _name 绑定到 unicode 对象时,python 2 会自动将字节串模板“提升”为 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')

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-12-20
    • 2019-12-06
    • 2019-05-20
    • 2018-12-09
    • 1970-01-01
    • 2017-09-13
    • 2014-04-14
    • 2023-03-25
    相关资源
    最近更新 更多