https://zhuanlan.zhihu.com/p/108805502
老的字符编码都可以转成unicode, 但是不能通过unicode互转.
使用unicode存入硬盘, 一方面是都采用unicode, 占据空间太大, 更重要的是, 在写入硬盘时, 造成IO增多.
utf-8: unicode transform format-8
英文: 1Bytes
汉字: 3Bytes
结论:
1. 内存固定使用unicode, 我们可以改变的是存入硬盘采用的格式
unicode>>>gbk
unicode>>>shift-jis
以后优先采用: unicode>>>utf-8
2. 文本文件存取乱码问题
存乱了: 编码格式应该设置成支持文件内字符的格式, 现在都应该存成utf-8
取乱了: 解决方法是, 文件是以什么编码格式存入硬盘的, 就应该以什么编码格式读入内存
平时没有遇到乱码问题, 因为文本编辑器都将编码默认存成了utf-8.
windows平台默认采用GBK
3. python3默认读文件的编码是utf-8
python2默认读文件的编码是ascii
解决方法: 指定文件头修改默认的编码
在py文件的首行写:
#coding:gbk 该文件不叫注释, 叫文件头. 控制的是读文件的编码.
控制存所用编码的是编辑器.
在使用pycharm写程序时, 可以通过pycharm下方设置编码格式, 当然可以采用默认的编码格式. 例如编写代码时采用的是GBK格式, 那么编写后的文本代码会在内存中转化为unicode, 然后转化为GBK存到硬盘中. 运行程序时, 首先运行python解释器, 然后python解释器将代码读取到内存, python2解释器默认读取的代码格式是ascii, python3解释器默认读取的格式是utf-8. 所以为了防止读取时出现乱码, 要在文件头部指定编码格式. 所指定的编码格式应该为写代码时采用的编码格式. 注意, python解释器在读取第一行代码时, 使用的默认的编码格式. 然后再使用文件头指定的编码格式读取其他内容.
4. 保证运行python程序前两个阶段不乱码的核心法则:
指定文件头
# coding:文件当初存入硬盘时所采用的编码格式
实际上, 设置好文件头后, pycharm会自动对下方写的代码格式进行优化, 如下:
5. python3的str类型默认直接存成unicode格式, 无论如何都不会乱码, 所以啥也不用做
python2的str类型默认保存形式不是unicode, 为了保证python2的str类型不乱码, 需要在字符串前面加上u:
x = u‘上‘
6. 了解
python2解释器有两种字符串类型: str unicode
# str类型
x = ‘上‘ # 字符串值会按照文件头指定的编码格式存入变量值的内存空间.
例如, 如果文件头coding: gbk, 那么该字符会以gbk的格式存于内存中, 如果想执行print(x), 则会将gbk格式的数据转成unicode, 然后再转成字符‘上‘. 如果使用pycharm终端显示, 则会默认采用utf-8的形式(这个我们决定不了)将字节码转换为unicode, 所以会出现乱码. 如果用windows的cmd终端, 则会默认采用gbk的形式将字节码转换为unicode, 不会出现乱码.
# unicode类型
x = u‘上‘ # 强制存成unicode
原文:https://www.cnblogs.com/libyan/p/13099521.html