当我在Python中直接print
一个unicode字符串时,我看到的字符串具有与字符串中相同的字符。当我将其嵌入某个容器(放入列表、映射等)中时,str
表示将unicode字符转换为\uxxx表示。
有趣的是,我可以用一个字符串调用这个容器上的print
,但不能调用字符串本身的print str
(给出一个UnicodeEncodeError)。在
我可以配置str
将嵌套字符串编码为UTF8字符串吗?看这个十六进制符号使调试非常痛苦。在
示例:
>>> v = u"abc123абв"
>>> d = [v]
>>> print v
abc123абв
>>> print d
[u'abc123\u0430\u0431\u0432']
>>> print str(v)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeEncodeError: 'ascii' codec cant encode characters in position 6-8: ordinal not in range(128)
>>> print str(d)
[u'abc123\u0430\u0431\u0432']
我在ubuntu上使用python2.7.6,控制台编码是UTF8。Python似乎也使用UTF8:
^{pr2}$
print [v]
调用repr(v)
,按原样返回ascii可打印字符,其他所有内容使用\x
,\u
,\U
。。。在记住,像
dict(a=1)
这样的对象与其文本表示(repr(dict(a=1))
)不同。Unicode字符串也是一个对象(type(v) == unicode
),因此repr(v) is not v
(顺便说一句,repr(repr(v)) is not repr(v)
也要考虑一下)。在要在Python控制台中显示供调试的可读文本,可以提供自定义的
sys.displayhook
,例如,可以使用sys.stdout.encoding
对任何(嵌入的)unicode
对象进行编码。在python3中,repr(unicode_string)
返回当前环境中可打印的Unicode字符(将转义导致UnicodeEncodeError
的字符)。在str(v)
升高UnicodeEncodeError
是无关的。str(v)
调用v.encode(sys.getdefaultencoding())
,因此对于任何带有非ascii字符的unicode字符串,它都失败。不要对Unicode字符串调用str()
(这几乎总是一个错误),而是直接打印Unicode。在不要改变
str
,改变你的way of thinking
。在如果您需要打印netsted元素而不是从容器中获取并打印它-不要打印所有容器。在
顺便说一句:Python打印十六进制代码(和其他元素),用于测试/调试。在
当你看到
^{pr2}$您知道:它是列表(
[
和]
)和unicode文本(u
和'
),并且文本中有非ASCII字符。在相关问题 更多 >
编程相关推荐