设置Python打印汉字编码

Setting Python encoding for printing Chinese characters

我的代码如下。不知道为什么不能打印中文。请帮忙。

当尝试一次打印多个变量时,文字看起来像 ASCII 或原始类型。

如何解决?

# -*- 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)

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

print( rows[0], rows[1] )

被评估为

tmp = ( rows[0], rows[1] ) # a tuple!
print tmp # Python 2 print statement!

由于元组的默认格式化是通过 repr() 完成的,您会看到 ASCII 转义表示。

解决方案:升级到Python 3.

有两个比升级到 Python 3.

更温和的解决方案

首先是不要使用Python3print()语法:

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

第二种是将Python3print()语法导入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 模块中)并且弊大于利。

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

reload(sys)  
sys.setdefaultencoding('utf8')

设置 Python 默认编码真是穷人的把戏。它很少真正有用 - 恕我直言,它不在显示的代码中 - 并且只应在没有更清洁的方法时使用。几十年来,我一直在使用 Python 2 和非 ascii 字符集 (Latin1),并且只在我的第一个脚本中使用过它。

这里 Python 也没有使用 # -*- coding: utf-8 -*-,尽管它可能对您的文本编辑器有用:它只有在您拥有 unicode[=44 时才有意义=] 脚本中的文字字符串 - 你没有的。

现在真正发生了什么:

您将 row 定义为包含以 utf8 编码的中文字符的(字节)字符串的 2 元组。很好

打印字符串时,字符会直接传递到输出系统(这里是终端或屏幕)。当它正确处理 UTF8 时,它会将 utf8 字节表示形式转换为正确的字符。所以 print (row[0]) (在 Python 中执行为 print row[0] 2 - (row[0]) 不是元组,(row[0],) 是 1 元组)正确显示汉字。

但是当你打印一个元组时,Python实际上打印了元组元素的表示(对于列表、集合或映射来说是一样的).而在Python2中,一个字节或unicode字符串的表示将所有非ASCII字符编码成\x..\u....形式。

在 Python 交互式会话中,您应该看到:

>>> print rows[0]
已
>>> print repr(rows[0])
'\xe5\xb7\xb2'

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

print '(' + ', '.join(rows) + ')'

按预期显示:

(已, 经激活的区域语言)