汉字编码

时间:2018-05-09 07:18:54

标签: python encoding

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

当尝试在一行中打印多个变量时,单词看起来像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)

3 个答案:

答案 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) + ')'

按预期显示:

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