python 无法显示汉字

作者&投稿:鱼殃 (若有异议请与网页底部的电邮联系)
python IDLE以及控制台中无法正确显示中文~

Python显示中文的问题很头大,原因在于Windows中文版的编码格式是GBK,因此直接显示中文会显示乱码的问题。
因此我们可以在开头加上#_*_encoding:_*_ 可以代笔:UTF8或cp936等编码。

定义统一编码是:# coding:utf-8
不是你给的 #encoding=utf-8。

还有,Python2默认用的是ASCII码,只支持字母和数字,不支持其他字符。
Python3默认是Unicode,可以直接识别。
上面的统一编码你改了还不行的话就用Python3吧,Python2的编码问题确实头痛

实际上,这段代码所出现的问题和cPickle模块没什么关系。而是Python 2显示中文“乱码”的问题。
Python 2中,str是8-bit string sequence(有点像Python 3中的bytes)。而Python 3中str就相当于Python 2中的unicode。
所以,

>>> a = '上海'
>>> repr(a)
"'\\xc9\\xcf\\xba\\xa3'"
>>> a # a中存储的8字节转义字符序列
'\xc9\xcf\xba\xa3'
>>> print a # 输出a,在此过程中,会对a进行解码操作,然后输出
上海

上例中,可以看到:
a = '上海'
a中实际存储的是:
'\xc9\xcf\xba\xa3'
这样一个字节序列。它实际上是对'上海'这个unicode字符串按gbk/cp936/gb18030编码得到的(和简体中文Windows操作系统的默认编码有关)。
给你推荐一篇博客:
http://blog.csdn.net/kiki113/article/details/4062063

下面是我写的示例:

# _*_ coding: gbk _*_

# Test with Python 2.7, Python 3.3 on Windows XP

try:
    import cPickle as p
except:
    import pickle as p

address_file = 'address.txt'

class Human(object):
    def __init__(self, address):
        self.address = address

    def txl(self):
        af = {'address': self.address}
        print(af)
        print(af['address'])
        f = open(address_file, 'wb') # In python 3, use binary mode.
        # In python 2.7, default protocol is 0.
        # However, it is 3 in python 3.3.
        p.dump(af, f, 0)
        f.close()

address = '上海'
print(address)

dq = Human(address)
dq.txl()

af = open(address_file, 'rb') #
print(p.load(af))
af.close()

"""
Output
----------------------------------------
Python 2.7.6:
1. # -*- coding: utf-8 -*-
涓婃捣
{'address': '\xe4\xb8\x8a\xe6\xb5\xb7'}
涓婃捣
{'address': '\xe4\xb8\x8a\xe6\xb5\xb7'}
2. # -*- coding: gbk -*- or # _*_ coding: cp936 _*_
上海
{'address': '\xc9\xcf\xba\xa3'}
上海
{'address': '\xc9\xcf\xba\xa3'}

Python 3.3.3:
上海
{'address': '上海'}
上海
{'address': '上海'}
------------------------------------------
In Python 3.3.3:
>>> '上海'.encode('utf-8')
b'\xe4\xb8\x8a\xe6\xb5\xb7'
>>> _.decode('cp936')
'涓婃捣'
"""

从这个示例中可以看出,虽然把字典整个print出来不能正常解析address中的内容:

>>> addr = {'addr': '上海'}
>>> addr
{'addr': '\xc9\xcf\xba\xa3'}
>>> print addr
{'addr': '\xc9\xcf\xba\xa3'}

但是单独打印:

>>> addr['addr']
'\xc9\xcf\xba\xa3'
>>> print addr['addr'] # print 输出之前隐含了编码解码操作,但为何打印整个字典时输出不正常尚待研究
上海

一切OK。
所以,如果真的用Python 2的话,对于该问题可以考虑手工负责编码、解码操作(如果使用print单独打印地址信息,就不用这么麻烦了,因为这些事它帮你做了)。用Python3,就没这么多问题了。


最后补充一点,pickle模块只是提供了一种序列化Python对象的方法。所以序列化生成的文件中和想象的不一样也不足为奇。正如自由de王国所说的,只要序列化后还能够反序列化成功就行了。实际上,当protocol不是0的情况下,序列化生成的文件是二进制格式的,根本没法用记事本直接看。



你用的是pickle,它写入文件的内容不是让人读的,而是让pickle读的,所以你不用在意。你自己写文件试试,应该是汉字。

是汉字乱码吗?
开始加上下面这句话
# -*- coding: utf-8 -*-

库不对 3.X就没这个问题了


建平县18441113792: 为什么使用python编程不能显示中文 -
戢彼炉甘: 请给出“不能显示中文”的程序片段,以及python版本和操作系统版本

建平县18441113792: 为什么Python没输出中文? -
戢彼炉甘: 本地执行可以显示中文. 代码在线工具中使用以下方法print("\u5510\u5b9d\u6743".encode('utf-8').decode('unicode_escape'))

建平县18441113792: Python print无法输出中文字符 -
戢彼炉甘: 先要说明白,两个“命令行”各是指什么.如果你用python2.7,那么在源代码开头加上codeing:gb18030,这样会让你在windows下更自在,基本上不出错.如果你用的是python3,那么要输出到“控制台”,或者是输出到文件时均要编码.编码成"gb18030" 比如这样:s="中文" print s.encode("gb18030")

建平县18441113792: 为什么python我不能输入中文 -
戢彼炉甘: Python | 多种编码文件(中文)乱码问题解决 http://jingyan.baidu.com/article/425e69e6e111a1be15fc1609.html

建平县18441113792: python脚本中不能有中文怎么办 -
戢彼炉甘: # encoding: utf-8 在文件开头加入上一句就ok了

建平县18441113792: python IDLE以及控制台中无法正确显示中文 -
戢彼炉甘: Python显示中文的问题很头大,原因在于Windows中文版的编码格式是GBK,因此直接显示中文会显示乱码的问题.因此我们可以在开头加上#_*_encoding:<>_*_ <>可以代笔:UTF8或cp936等编码.

建平县18441113792: python是不是输不进去中文,怎么解决,比如输入中国,但是print 不了 -
戢彼炉甘: 非也,LZ:1、无论是 C 还是Java,任何一种计算机编程语言都要遵守编码准则,而世界所有的计算机遵守的一种编码规则是ASCII(American Standard Code for Information Interchange),它用于显示英文和西欧语言; 2、要用python输出中文字符,必须在每个.py文件开头首两行特别添加一行声明文件编码的注释,如下:#!/usr/bin/python# -*- coding: utf-8 -*-,否则python2会默认使用ASCII编码,输出的也就是常见的乱码.

建平县18441113792: python绘图界面中文显示 -
戢彼炉甘: 这个可能跟字符集有关系,因为绘图界面可能用的是其他编码的,比如gbk什么的.所以一定要看看十六进制究竟是什么,通过unicode这个中介转换成界面允许的编码.

建平县18441113792: 难道python竟然不支持中文吗 -
戢彼炉甘: 肯定支持的呀.有不少python做的软件能正常显示中文的.你说的不支持是什么意思?也许你编码没搞对吧.

建平县18441113792: python字符串怎么显示中文 -
戢彼炉甘: 代码中字符串的默认编码与代码文件本身的编码一致 . 如:s='中文' 如果是在utf8的文件中,该字符串就是utf8编码,如果是在gb2312的文件中,则其编码为gb2312.这种情况下,要进行编码转换,都需 要先用decode方法将其转换成unicode编码,再使用encode方法将其转换成其他编码.通常,在没有指定特定的编码方式时,都是使用的系统默 认编码创建的代码文件. 如果字符串是这样定义:s=u'中文' 则该字符串的编码就被指定为unicode了,即python的内部编码,而与代码文件本身的编码无关.因此,对于这种情况做编码转换,只需要直接使用encode方法将其转换成指定编码即可.

本站内容来自于网友发表,不代表本站立场,仅表示其个人看法,不对其真实性、正确性、有效性作任何的担保
相关事宜请发邮件给我们
© 星空见康网