1.     有人说reload必须要有

import sys
reload(sys)
sys.setdefaultencoding('utf-8')

 

2.

#!/usr/bin/env python
# -*- mode: python; c-basic-offset: 2; indent-tabs-mode: nil; coding: utf-8; -*-

3.查看一下 :

>>> import sys
>>> sys.getdefaultencoding()
'utf-8'

 如果不是UTF-8 :

  • 运行程序的时候加上:
PYTHONIOENCODING=utf-8 python code.py

 

4. python 命令行中输入

ll='中'
 ll
 '\xe4\xb8\xad'
 print ll


print ll,会按照终端的编码执行x.decode('终端编码'),变成unicode后,再打印,此时终端编码若与文件开头指定的编码不一致,乱码就产生了

其实utf-8编码之所以能在windows gbk的终端下显示正常,是因为到了内存里python解释器把utf-8转成了unicode , 
但是这只是python3, 并不是所有的编程语言在内存里默认编码都是unicode,比如 万恶的python2 就不是,
它是ASCII(龟叔当初设计Python时的一点缺陷),想写中文,就必须声明文件头的coding为gbk or utf-8, 声明之后,python2解释器
仅以文件头声明的编码去解释你的代码,加载到内存后,并不会主动帮你转为unicode,也就是说,你的文件编码是utf-8,
加载到内存里,你的变量字符串就也是utf-8, 这意味着什么?意味着,你以utf-8编码的文件,
在windows是乱码。

总结:

1.读入文本文件的时候,是二进制码(0b......),根据utf-8读入。

 2. python2.X版本需要str.decode()才可以转换成unicode.而python3.X是自动转换的。

3.写入文件的时候,如果不加reload(sys) sys.setdefaultencoding('utf-8')。及时在python3.X版本中也会有如下问题:

在最新的python 3版本中,字符串的类型是str, 在内存中都是以Unicode表示,一个字符对应若干个字节; 
如果要在网络上传输,或者保存到磁盘上,就需要把str变为以字节为单位的bytes。

以Unicode表示的str通过encode()方法可以编码为指定的bytes,例如:

>>> 'ABC'.encode('ascii')
 b'ABC'
 >>> '中文'.encode('utf-8')
 b'\xe4\xb8\xad\xe6\x96\x87'
 >>> '中文'.encode('ascii')
 Traceback (most recent call last):
   File "<stdin>", line 1, in <module>
 UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)12345678

在操作字符串时,我们经常遇到str和bytes的互相转换。为了避免乱码问题,应当始终坚持使用UTF-8编码对str和bytes进行转换
----