首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >设置用于打印汉字的Python编码

设置用于打印汉字的Python编码
EN

Stack Overflow用户
提问于 2018-05-09 07:18:53
回答 3查看 3.2K关注 0票数 2

我的密码在下面。我不知道为什么不能打印中文。请帮帮忙。

当尝试一次打印多个变量时,单词看起来像ASCII或raw类型。

怎么修呢?

代码语言:javascript
复制
# -*- 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)
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-09 07:59:02

所有的输出都是正常的。顺便说一句,这个:

代码语言:javascript
复制
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交互会话中,您应该看到:

代码语言:javascript
复制
>>> print rows[0]
已
>>> print repr(rows[0])
'\xe5\xb7\xb2'

TL/DR:当您打印容器时,实际上是打印元素的表示形式。如果要显示字符串值,请使用显式循环或联接:

代码语言:javascript
复制
print '(' + ', '.join(rows) + ')'

按预期显示:

代码语言:javascript
复制
(已, 经激活的区域语言)
票数 3
EN

Stack Overflow用户

发布于 2018-05-09 07:22:10

我想,您的问题是您正在使用Python 2。你的代码

代码语言:javascript
复制
print( rows[0], rows[1] )

被评估为

代码语言:javascript
复制
tmp = ( rows[0], rows[1] ) # a tuple!
print tmp # Python 2 print statement!

由于元组的默认格式是通过repr()完成的,因此可以看到ASCII转义表示。

解决方案:升级到Python 3。

票数 0
EN

Stack Overflow用户

发布于 2018-05-09 07:58:50

有两种比升级到Python 3更简单的解决方案。

第一种是不使用Python3 print()语法:

代码语言:javascript
复制
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:

代码语言:javascript
复制
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模块中),而且弊大于利。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50247602

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档