当我在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
答案 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字符。