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

时间:2015-11-15 19:15:13

标签: python unicode encoding

当我在Python中直接print一个unicode字符串时,我看到一个字符串与我在字符串中的字符相同。当我将它嵌入某个容器(放入列表,地图等)时,str表示将unicode字符转换为\ uXXXX表示。 有趣的是,我可以使用字符串在此容器上调用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上使用Python 2.7.6,而控制台编码是UTF8。 Python似乎也使用UTF8:

>>> print(sys.stdout.encoding)
UTF-8
>>> print(locale.getpreferredencoding())
UTF-8
>>> print(sys.getfilesystemencoding())
UTF-8

2 个答案:

答案 0 :(得分:3)

print [v]调用repr(v)按原样返回ascii可打印字符,其他所有内容都使用\x\u\U转义... < / p>

请记住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,例如,您可以使用unicode对任何(嵌入式)sys.stdout.encoding对象进行编码。在Python 3中,repr(unicode_string)返回可在当前环境中打印的Unicode字符(导致UnicodeEncodeError转义的字符)。

str(v)提出UnicodeEncodeError无关紧要。 str(v)调用v.encode(sys.getdefaultencoding()),因此任何带有非ascii字符的unicode字符串都会失败。不要在Unicode字符串上调用str()(这几乎总是一个错误),而是直接打印Unicode。

答案 1 :(得分:1)

请勿更改str,更改way of thinking

如果您需要打印netsted元素而不是从容器中取出并打印它 - 请勿打印所有容器。

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

print d[0]
# abc123абв

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

btw:Python打印十六进制代码(和其他元素)用于测试/调试原因。

当你看到

[u'abc123\u0430\u0431\u0432']

你知道:它是带有unicode文本([])的列表(u'),并且该文本中有非ASCII字符。