设置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) + ')'
按预期显示:
(已, 经激活的区域语言)
我的代码如下。不知道为什么不能打印中文。请帮忙。
当尝试一次打印多个变量时,文字看起来像 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) + ')'
按预期显示:
(已, 经激活的区域语言)