编码就是将人类识别的字符转计算机可以识别的二进制 及逆向的过程
ascii 码
计算机最早由美国人发明,他们本身没有太多符号需要编译
设计 8 位 256 种可能就可以完全够用
8位一个字节,所以 ascii 码是一个单字节编码表
里面没有中文和其它国家的符号,所以计算机推广到全世界后不能通用
gb2312: 中国基于自已的语言设计的一种编码方式,不能涵盖所有的汉字
......
unicode
如果每个国家都采用自已的编码,不利于信息的传播,如此产生了 万国码
规定 四个字符存储一个符号
英文本身只需一个字节就够,所以这种编码在存储文件时会造成大量的空间浪费
utf8
类似的有 utf32 utf16 ,都可以认为是 Unicode 的升级,变长存储
定义一个英文按1个字节,一个中文按3个字节
在 python3 中字符是以 Unicode 存储于内存中的
unicode 定长存在于内存中,便于寻址查找,提高速度
因为 Unicode 可能存在空间 “浪费”,所以写入硬盘中的内容是 bytes
支持 bytes 的编码有 Utf8 gbk 等【非unicode】
综上所述:
文件内容读取到内存中时 需要 decode 为 unicode
内存中的文件写入到硬盘时 需要 endcode 为 bytes
01 read模式
f = open("***", "r", endcoding="编码位")
# 不要纠结是 open 还是 with open ,还没写 close 呢
常见问题: 如果不指定 encoding 时会报 gbk can not decode byte.....
思考:
上述现象一定是编码问题
需要确认当前 project 编码,一般 pycharm 新建工程默认都是 utf8
结论:
被打开的文件如果在项目中新建,那么一定是 utf8 编码,可以查看字节数确定
被打开文件内容读取到内存中时一定要先 decode 为 unicode
如果不指定被打开文件中的 bytes 是何种编码规则那么 windows 系统默认会采用 gbk
就是说我们有一段 utf8编码规则的 bytes 正在被 gbk规则进行 decode ,所以会报错
解决:指定 encoding="utf8"
02 write模式
f = open("***", "写模式", endcoding="编码位")
w 写模式:
此时写入的内容必须是 str 类
之前讨论过 写入硬盘时必须是 bytes 类型,所以要将 unicode 进行 encoding
基于当前项目默认编码,在 w 之前要设置 encoding 为 utf8
wb 写模式:
此时写入的内容必采是 bytes 类
此时一定不要设置 encoding 因为,在写入之前已经将 str encode 过
原文:https://www.cnblogs.com/yyshi/p/10688322.html