如何防止str将unicode字符编码为十六进制代码?

2024-09-26 18:10:59 发布

您现在位置:Python中文网/ 问答频道 /正文

当我在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}$

Tags: 字符串in编码列表unicodeutf8字符容器
2条回答

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元素而不是从容器中获取并打印它-不要打印所有容器。在

v = u"abc123абв"
d = [v, v, v]

print d[0]
# abc123абв

print ", ".join(d)
# abc123абв, abc123абв, abc123абв

顺便说一句:Python打印十六进制代码(和其他元素),用于测试/调试。在

当你看到

^{pr2}$

您知道:它是列表([])和unicode文本(u'),并且文本中有非ASCII字符。在

相关问题 更多 >

    热门问题