我有一个unicode对象的元组列表:
>>> t = [('亀',), ('犬',)]
打印出来,我得到:
>>> print t
[('\xe4\xba\x80',), ('\xe7\x8a\xac',)]
我想这是这些字符串的utf-8字节码表示的列表?
但我想看到的是打印出来的,惊喜:
[('亀',), ('犬',)]
但我在将字节码恢复为人类可读的形式方面遇到了过多的麻烦。
我有一个unicode对象的元组列表:
>>> t = [('亀',), ('犬',)]
打印出来,我得到:
>>> print t
[('\xe4\xba\x80',), ('\xe7\x8a\xac',)]
我想这是这些字符串的utf-8字节码表示的列表?
但我想看到的是打印出来的,惊喜:
[('亀',), ('犬',)]
但我在将字节码恢复为人类可读的形式方面遇到了过多的麻烦。
但我想看到的是打印出来的,惊喜:
[('亀',),('犬',)]
你想看到它打印出来的是什么?因为如果它是控制台,它完全不能保证您的控制台可以显示这些字符。这就是Python的'repr()'对象表示用于\ -escapes的安全选项的原因,您将始终能够在屏幕上看到并轻松输入。
作为先决条件,您应该使用Unicode字符串(u'')。而且,正如Matthew所提到的,如果你想能够直接在源代码中编写u'亀',你需要确保Python能够读取文件的编码。对于偶尔使用非ASCII字符,最好坚持使用转义版本u'\ u4e80',但是当你想要阅读很多东亚文本时,“#coding = utf-8”是绝对是要走的路。
print'[%s]'%','。join([','。join('(%s,)'%','。join(ti)for ti in t)])
这将打印用引号打开的字符。你真的想要:
def reprunicode(u):
return repr(u).decode('raw_unicode_escape')
print u'[%s]' % u', '.join([u'(%s,)' % reprunicode(ti[0]) for ti in t])
这可行,但如果控制台不支持Unicode(这在Windows上特别麻烦),你会得到一个很大的旧UnicodeError。
在任何情况下,这很少很重要,因为你在这里看到的对象的repr()通常不会进入应用程序的公共用户界面;它只适用于编码器。
但是,您会很高兴知道Python 3.0的行为完全符合您的要求:
Python 3.0有点新,而且库不太受支持,但它可能更适合您的需求。
但我想看到的是打印出来的,惊喜:
[('亀',),('犬',)]
你想看到它打印出来的是什么?因为如果它是控制台,它完全不能保证您的控制台可以显示这些字符。这就是Python的'repr()'对象表示用于\ -escapes的安全选项的原因,您将始终能够在屏幕上看到并轻松输入。
作为先决条件,您应该使用Unicode字符串(u'')。而且,正如Matthew所提到的,如果你想能够直接在源代码中编写u'亀',你需要确保Python能够读取文件的编码。对于偶尔使用非ASCII字符,最好坚持使用转义版本u'\ u4e80',但是当你想要阅读很多东亚文本时,“#coding = utf-8”是绝对是要走的路。
print'[%s]'%','。join([','。join('(%s,)'%','。join(ti)for ti in t)])
这将打印用引号打开的字符。你真的想要:
def reprunicode(u):
return repr(u).decode('raw_unicode_escape')
print u'[%s]' % u', '.join([u'(%s,)' % reprunicode(ti[0]) for ti in t])
这可行,但如果控制台不支持Unicode(这在Windows上特别麻烦),你会得到一个很大的旧UnicodeError。
在任何情况下,这很少很重要,因为你在这里看到的对象的repr()通常不会进入应用程序的公共用户界面;它只适用于编码器。
但是,您会很高兴知道Python 3.0的行为完全符合您的要求:
Python 3.0有点新,而且库不太受支持,但它可能更适合您的需求。
首先,你的帖子中存在轻微的误解。如果您定义这样的列表:
>>> t = [('亀',), ('犬',)]
......那些不是 unicode
你定义的,但是 str
秒。如果你想拥有 unicode
类型,你必须添加一个 u
在角色之前:
>>> t = [(u'亀',), (u'犬',)]
但是我们假设你真的想要 str
不,不是 unicode
秒。主要问题是, __str__
列表(或元组)的方法实际上等于它 __repr__
method(返回一个字符串,在计算时,将创建完全相同的对象)。因为 __repr__
方法应该是独立于编码的,字符串尽可能以最安全的方式表示,即ASCII范围之外的每个字符都表示为十六进制字符(\xe4
, 例如)。
不幸的是,据我所知,没有用于打印区域设置感知的列表的库方法。您可以使用几乎通用的功能,如下所示:
def collection_str(collection):
if isinstance(collection, list):
brackets = '[%s]'
single_add = ''
elif isinstance(collection, tuple):
brackets = '(%s)'
single_add =','
else:
return str(collection)
items = ', '.join([collection_str(x) for x in collection])
if len(collection) == 1:
items += single_add
return brackets % items
>>> print collection_str(t)
[('亀',), ('犬',)]
请注意,这不适用于所有可能的集合(例如,集合和字典),但很容易扩展它来处理这些集合。
Python源代码文件严格是ASCII,因此必须使用 \u
除非您指定编码,否则转义序列。看到 PEP 0263。
#!/usr/bin/python
# coding=utf-8
t = [u'亀', u'犬']
print t
将数组传递给 print
,Python使用Python将对象转换为字符串 字符串转换的规则。此类转换的输出是专为 eval()
,这就是你看到这些的原因 \u
序列。基于bobince的解决方案,这是一个解决问题的方法。控制台必须接受Unicode,否则会引发异常。
t = [(u'亀',), (u'犬',)]
print repr(t).decode('raw_unicode_escape')
尝试:
import codecs, sys
sys.stdout = codecs.getwriter('utf8')(sys.stdout)
所以这似乎做我想要的:
print '[%s]' % ', '.join([', '.join('(%s,)' % ', '.join(ti) for ti in t)])
>>> t = [('亀',), ('犬',)]
>>> print t
[('\xe4\xba\x80',), ('\xe7\x8a\xac',)]
>>> print '[%s]' % ', '.join([', '.join('(%s,)' % ', '.join(ti) for ti in t)])
[(亀,), (犬,)]
一定 有一个更好的方法来做到这一点。
(但到目前为止,其他两个答案不会导致原始字符串按需要打印出来)。
似乎人们错过了人们想要的东西。当我从元组打印unicode时,我只想摆脱'u''[''('和引号。我们想要的是一个类似下面的函数。 在搜索网络之后,它似乎是获取原子可显示数据的最简洁方法。 如果数据不在元组或列表中,我认为这个问题不存在。
def Plain(self, U_String) :
P_String = str(U_String)
m=re.search("^\(\u?\'(.*)\'\,\)$", P_String)
if (m) : #Typical unicode
P_String = m.group(1).decode("utf8")
return P_String