我的代码如下
我不知道为什么不能打印中文。请帮忙。
当尝试在一行中打印多个变量时,单词看起来像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)
答案 0 :(得分:0)
我的问题是你使用的是Python 2。你的代码
.as-console-wrapper { max-height: 100% !important; top: 0; }
评估为
print( rows[0], rows[1] )
由于元组的默认格式是通过tmp = ( rows[0], rows[1] ) # a tuple!
print tmp # Python 2 print statement!
完成的,因此您可以看到ASCII转义表示。
解决方案:升级到Python 3。
答案 1 :(得分:0)
与升级到Python 3相比,有两个不太激烈的解决方案。
首先不要使用Python 3 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
第二种是将Python 3 print()
语法导入Python 2:
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
模块中)并且弊大于利。
答案 2 :(得分:0)
你的所有输出都是正常的。顺便说一下,这个:
reload(sys)
sys.setdefaultencoding('utf8')
实际上是设置Python默认编码的穷人技巧。它很少有用 - 恕我直言,它不是在显示的代码中 - 并且只应在没有更清洁的方式时使用。几十年来,我一直在使用Python 2与非ascii charset(Latin1),并且只在我的第一个脚本中使用它。
此处Python不使用# -*- coding: utf-8 -*-
,虽然它可能对您的文本编辑器有用:只有在脚本中有 unicode 文字字符串时才有意义 - 什么你还没有。
现在真正发生了什么:
将row
定义为包含以utf8编码的中文字符的2字节(字节)字符串。细
打印字符串时,字符会直接传递到输出系统(此处为终端或屏幕)。由于它正确处理UTF8,它将utf8字节表示转换为正确的字符。因此print (row[0])
(在Python 2中作为print row[0]
执行 - (row[0])
不是元组,(row[0],)
是1元组)正确显示中文字符。
但是当你打印一个元组时,Python实际上会打印元组元素的表示(列表,集合或映射都是一样的)。在Python 2中,字节或unicode字符串的表示形式编码\x..
个\u....
形式的所有非ASCII字符。
在Python交互式会话中,您应该看到:
>>> print rows[0]
已
>>> print repr(rows[0])
'\xe5\xb7\xb2'
TL / DR:当您打印容器时,实际上是打印元素的表示。如果要显示字符串值,请使用显式循环或连接:
print '(' + ', '.join(rows) + ')'
按预期显示:
(已, 经激活的区域语言)