Python 转换终端上带有_repr__的显示对象的unicode字符串

Python 转换终端上带有_repr__的显示对象的unicode字符串,python,unicode,encoding,character-encoding,python-2.x,Python,Unicode,Encoding,Character Encoding,Python 2.x,我想转换字符串u'Eichst\xe4tt Landershofen',以便在终端上打印对象站 import json class Station(object): def __init__(self,id, name, latitude, longitude): self._id = id self._name = name self._latitude = latitude self._longitude = long

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

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)

字符串
u'Eichst\xe4tt-Landershofen'
被一个文件读取,该文件使用
encoding='ISO-8859-1'

首先,我建议不要使用
\u repr\uuuu
,因为它并不是真正用于人类可读的对象表示。为此,您应该查看
\uuuuu str\uuuuuuuu
\uuuuuu格式\uuuuuuuuu
,和/或
\uuuuuuuu unicode\uuuuu

现在,您的问题是
\uuuu repr\uuu
正在返回一个unicode对象。这是因为当您使用字符串替换
''%\u name
并且
\u name
绑定到unicode对象时,python 2会自动将bytestring模板“升级”为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')
导入json
类站(对象):
定义初始(自我、id、姓名、纬度、经度):
self.\u id=id
self.\u name=name
自身纬度=纬度
自身经度=经度
def get_名称(自身):
返回self.\u name
def ___; unicode(自):
返回u“”。格式为(
self.\uuuuu类\uuuuuuu名\uuuuuuuuu,
自我识别,
self.get_name(),
自身纬度,
自我.\u经度,
)
定义报告(自我):
返回unicode(self).encode('utf8')

当您添加
.encode('iso-8859-1')
时,您得到了什么?我得到了输出:
。可以转换吗� 转换为可读字符?@BurhanKhalid:源文件是
iso-8859-1
,但我们不知道终端选择了什么编码。希望它是
'utf-8'
。当您添加
时,它能工作吗?相反,编码('utf-8')
?顺便说一句,在询问Unicode问题时,您应该始终添加Python版本标记,因为Python 3处理Unicode的方式与Python 2完全不同。如果我将函数
get\u name(self)
中的
self.name
更改为
self\u name.encode('UTF-8')
,我会得到与
.encode('iso-8859-1')
相同的输出。
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')