1. 有人说reload必须要有
|
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进行转换
----