我的密码在下面。我不知道为什么不能打印中文。请帮帮忙。
当尝试一次打印多个变量时,单词看起来像ASCII或raw类型。
怎么修呢?
# -*- coding: utf-8 -*-
import pygoldilocks
import sys
reload(sys)
sys.setdefaultencoding('utf8')
rows = ( '已','经激活的区域语言' )
print( rows[0] )
print( rows[1] )
print( rows[0], rows[1] )
print( rows[0].encode('utf8'), rows[1].decode('utf8') )
print( rows[0], 1 )
$ python test.py
已
经激活的区域语言
('\xe5\xb7\xb2', '\xe7\xbb\x8f\xe6\xbf\x80\xe6\xb4\xbb\xe7\x9a\x84\xe5\x8c\xba\xe5\x9f\x9f\xe8\xaf\xad\xe8\xa8\x80')
('\xe5\xb7\xb2', u'\u7ecf\u6fc0\u6d3b\u7684\u533a\u57df\u8bed\u8a00')
('\xe5\xb7\xb2', 1)发布于 2018-05-09 07:59:02
所有的输出都是正常的。顺便说一句,这个:
reload(sys)
sys.setdefaultencoding('utf8')实际上是一个可怜的人设置Python默认编码的伎俩。它很少是真正有用的-- IMHO --它不是在显示的代码中--而且只有在没有更干净的方法时才应该使用。几十年来,我一直在使用非ascii字符集(Latin1)的Python2,并且只在我的第一个脚本中使用了它。
Python在这里也没有使用# -*- coding: utf-8 -*-,尽管它可能对文本编辑器很有用:只有当脚本中有unicode文字字符串时,它才有意义--而不是这样。
现在真正发生的事情是:
您可以将row定义为包含以utf8编码的汉字的(字节)字符串的两个元组。很好。
打印字符串时,这些字符直接传递到输出系统(这里是终端或屏幕)。当它正确地处理UTF8时,它将utf8字节表示转换为正确的字符。因此print (row[0]) (在Python2-(row[0])中作为print row[0]执行,(row[0],)不是元组,(row[0],)是一个1元组)正确地显示汉字。
但是,当您打印一个元组时,Python实际上会打印元组元素的表示形式(对于一个列表、集合或映射来说是一样的)。在Python2中,字节或unicode字符串的表示在\x.. of \u....窗体中编码所有非ASCII字符。
在Python交互会话中,您应该看到:
>>> print rows[0]
已
>>> print repr(rows[0])
'\xe5\xb7\xb2'TL/DR:当您打印容器时,实际上是打印元素的表示形式。如果要显示字符串值,请使用显式循环或联接:
print '(' + ', '.join(rows) + ')'按预期显示:
(已, 经激活的区域语言)发布于 2018-05-09 07:22:10
我想,您的问题是您正在使用Python 2。你的代码
print( rows[0], rows[1] )被评估为
tmp = ( rows[0], rows[1] ) # a tuple!
print tmp # Python 2 print statement!由于元组的默认格式是通过repr()完成的,因此可以看到ASCII转义表示。
解决方案:升级到Python 3。
发布于 2018-05-09 07:58:50
有两种比升级到Python 3更简单的解决方案。
第一种是不使用Python3 print()语法:
rows = ( '已','经激活的区域语言' )
print rows[0]
print rows[1]
print rows[0], rows[1]
print rows[0].decode('utf8'), rows[1].decode('utf8')
print rows[0], 1
已
经激活的区域语言
已 经激活的区域语言
已 经激活的区域语言
已 1第二种方法是将Python3 print()语法导入Python2:
from __future__ import print_function
rows = ( '已','经激活的区域语言' )
print (rows[0])
print (rows[1])
print (rows[0], rows[1])
print (rows[0].decode('utf8'), rows[1].decode('utf8'))
print (rows[0], 1)输出是相同的。
然后放下sys.setdefaultencoding()的电话。它不打算像那样使用(仅在site模块中),而且弊大于利。
https://stackoverflow.com/questions/50247602
复制相似问题