老生常谈Python基础之字符编码
发布时间 - 2026-01-11 01:52:18 点击率:次前言

字符编码非常容易出问题,我们要牢记几句话:
1.用什么编码保存的,就要用什么编码打开
2.程序的执行,是先将文件读入内存中
3.unicode是父编码,只能encode解码成其他编码格式
utf-8,GBK这些是子8编码,只能decode编码成Unicode
一、什么是字符编码
我们知道,计算机只能识别二进制,我们平时写的代码都需要转成二进制才能被计算机识别。所以,我们写的字符怎么转换成二进制呢,这个过程实际就是通过一个标准使我们写的字符与特定数字一一对应,这个标准就称为字符编码。
字符------(字符编码)------->数字
二、字符编码发展历程
1.ASCII码
计算机起源于美国,字符编码也起源于美国。但是美国人民使用的文字只有26个字母,再加上些特殊符号就搞定了。不像我们中国,小学生就要认识几千个汉字。所以美国人民就使用了ASCII码(美国信息交换标准码)作为字符编码,一个Bytes代表一个字符,1Bytes=8bit,可以有2的8次方即256中不同的变化,但最初只用了前7位,即127个字符,已经足够美国人民使用了(当然也出于成本的考虑)。后来将拉丁文编入第8位,至此,ASCII码就被占满了,英语国家和拉丁国家可以愉快的玩耍了。
2.GBK
别看咱们中国暂时科技比不上美帝国,但是咱们有一颗积极向上的心啊,于是,在1980年,国家标准总局发布了中文使用的字符编码-->GBK,使用两个字节表示一个汉字,这样就有2的16次方即65536种组合,已经足够汉字使用了。
同时,其他国家也分别发布了自己国家的字符编码标准,如日本的shift_JIS,韩国的Euc-kr等等
3.Unicode
据说,字符编码鼎盛时期有数百种,且彼此间互相不支持,看来各国人民都很有骨气,但是这太不利于世界的互通了,于是Unicode应运而生。1994年,国际标准化组织发布了号称万国码的Unicode,用两个字节表示一个字符,有65536种组合,已经能把全世界绝大多数语言包括了。
4.utf-8
Unicode虽然好,但有一个问题,本来用一个字节就能表示的英文,现在要用两个字节,存储空间平白多出一倍,这显然是不完美的,所以又产生了utf-8,对英文字符只用1个字节,对中文字符用3个字节来表示。
5.Unicode所有字符都是两个字节,简单粗暴,字符转换成数字的速度快,但是占用存储空间大
utf-8对不同的字符采用不用的长度表示,节省空间,但是转换效率不如Unicode快
内存中使用的字符编码是Unicode,内存就是为了加快速度的,所以宁肯牺牲一点空间,也要保证速度
硬盘和网络传输是用utf-8的,因为磁盘I/O或者网络I/O延迟要远大于utf-8的转换效率,并且在网络传输中应该尽可能节省带宽
三、Python解释器执行
第一阶段:python解释器启动,此时就相当于启动了一个文本编辑器
第二阶段:python解释器作为文本编辑器,去打开t.py文件,从硬盘上将t.py的文件内容读入到内存中
第三阶段:python解释器解释执行刚刚加载到内存中t.py的代码
其中第二阶段,t.py文件在保存时有一个字符编码,在Python解释器打开文件时也要指定一样的编码方式(Python2默认的编码方式是ASCII,Python3默认是utf-8),如果文件保存的编码格式和Python解释器默认的编码方式不一样,就要在文件的开头写上#coding: ,来告诉python解释器不要用自己默认的编码方式来读,而是要用头文件指定的方式来读文件,这样才不会出错。
第三阶段:读取已经加载到内存中的代码(默认是Unicode),然后执行,执行过程中如果碰到类似定义变量的操作,就会在内存中开辟一块新的内存空间。此时注意,新开辟的内存空间不一定也是Unicode,用户可以在定义变量的时候指定编码方式,定义时开辟的内存空间,也只是一块空间而已,可以存放任意编码格式的代码。以Python3为例
四、编码解码
保存文件是把内存中的文件保存到硬盘上
读文件是把硬盘中的文件读到内存
Unicode是父编码,utf-8,GBK这些是子编码,如果子码想转换成其他编码,必须要先转换成父编码,再由父编码转换成其他子编码
解码就是decode,是由子码转成父码Unicode的过程
编码就是encode,是由Unicode转换成其他编码的过程
之前说过,文件读入内存中,就成了Unicode编码(当然这是默认情况,也可以根据指令更改),从硬盘读文件的过程就是把硬盘中的utf-8解码成Unicode
文件保存时,就是由内存保存到硬盘的过程,硬盘中是utf-8的编码方式,需要由Unicode编码成utf-8
五、Python2和Python3的区别
1.Python2的默认编码方式是ASCII,打开utf-8保存的文件时会报错,应该在头文件上加#coding : utf-8
Python2中的str被识别为Bytes,所以Python2中的str是被编码后的结果,其实会默认做一件事,就是在str前面加一个u,先转换成Unicode,在encode成bytes
Python2中有两种字符串类型,str和Unicode,str可以通过在前面加个‘u'来转换成Unicode
2.python 3 的默认编码方式是utf-8,可以直接打开用utf-8保存的文件
Python3中的str被识别成Unicode
Python3中也有两种字符串类型(bytes和str),但bytes就是bytes,str是unicode
六、打印到终端
首先要知道,Windows的终端的默认编码方式是GBK
终端也是应用程序,是运行在内存中的,所以我们用print()打印的过程,是从内存中到内存中。所以对于unicode,怎么打印都不会出错,但是Python2中除了加‘u'的字符串外,其他的字符串是Bytes,此时终端中是GBK编码,而Python2中是指定的utf-8或者默认的ascii码时,在终端中打印就会出错。
这些是我目前的理解,如果我以后意识到错误或者有表述不清的地方,再来修改。唉,字符编码是个坑啊
以上这篇老生常谈Python基础之字符编码就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。
# python
# 字符编码
# Python面向对象编程基础解析(二)
# Python面向对象编程基础解析(一)
# python基础_文件操作实现全文或单行替换的方法
# 详解python基础之while循环及if判断
# Python基础教程之浅拷贝和深拷贝实例详解
# python实现决策树C4.5算法详解(在ID3基础上改进)
# Python3中的列表
# 元组
# 字典
# 字符串相关知识小结
# 转换成
# 美国
# 是由
# 要用
# 盘中
# 就会
# 也要
# 英文
# 给大家
# 发布了
# 拉丁文
# 编辑器
# 中国
# 转成
# 第三阶段
# 都是
# 网络传输
# 这是
# 头文件
# 加载
相关栏目:
【
网站优化151355 】
【
网络推广146373 】
【
网络技术251813 】
【
AI营销90571 】
相关推荐:
详解jQuery中的事件
Laravel如何记录日志_Laravel Logging系统配置与自定义日志通道
千问怎样用提示词获取健康建议_千问健康类提示词注意事项【指南】
想要更高端的建设网站,这些原则一定要坚持!
laravel怎么使用数据库工厂(Factory)生成带有关联模型的数据_laravel Factory生成关联数据方法
JS实现鼠标移上去显示图片或微信二维码
js实现获取鼠标当前的位置
在Oracle关闭情况下如何修改spfile的参数
html5怎么画眼睛_HT5用Canvas或SVG画眼球瞳孔加JS控制动态【绘制】
如何使用 Go 正则表达式精准提取括号内首个纯字母标识符(忽略数字与嵌套)
Win11怎么关闭资讯和兴趣_Windows11任务栏设置隐藏小组件
laravel怎么通过契约(Contracts)编程_laravel契约(Contracts)编程方法
东莞市网站制作公司有哪些,东莞找工作用什么网站好?
软银砸40亿美元收购DigitalBridge 强化AI资料中心布局
Laravel怎么做数据加密_Laravel内置Crypt门面的加密与解密功能
太平洋网站制作公司,网络用语太平洋是什么意思?
Swift中switch语句区间和元组模式匹配
Laravel如何实现密码重置功能_Laravel密码找回与重置流程
如何获取上海专业网站定制建站电话?
javascript中对象的定义、使用以及对象和原型链操作小结
高配服务器限时抢购:企业级配置与回收服务一站式优惠方案
如何在IIS管理器中快速创建并配置网站?
米侠浏览器网页图片不显示怎么办 米侠图片加载修复
制作旅游网站html,怎样注册旅游网站?
标准网站视频模板制作软件,现在有哪个网站的视频编辑素材最齐全的,背景音乐、音效等?
JavaScript如何实现音频处理_Web Audio API如何工作?
如何实现javascript表单验证_正则表达式有哪些实用技巧
如何在不使用负向后查找的情况下匹配特定条件前的换行符
Android Socket接口实现即时通讯实例代码
如何快速上传建站程序避免常见错误?
Laravel如何使用Service Container和依赖注入?(代码示例)
如何用5美元大硬盘VPS安全高效搭建个人网站?
Laravel如何保护应用免受CSRF攻击?(原理和示例)
Laravel怎么设置路由分组Prefix_Laravel多级路由嵌套与命名空间隔离【步骤】
,网页ppt怎么弄成自己的ppt?
如何快速查询网站的真实建站时间?
Laravel Blade模板引擎语法_Laravel Blade布局继承用法
php中::能调用final静态方法吗_final修饰静态方法调用规则【解答】
网站图片在线制作软件,怎么在图片上做链接?
消息称 OpenAI 正研发的神秘硬件设备或为智能笔,富士康代工
如何在七牛云存储上搭建网站并设置自定义域名?
中国移动官方网站首页入口 中国移动官网网页登录
laravel怎么在请求结束后执行任务(Terminable Middleware)_laravel Terminable Middleware请求结束任务执行方法
如何用好域名打造高点击率的自主建站?
郑州企业网站制作公司,郑州招聘网站有哪些?
深圳网站制作平台,深圳市做网站好的公司有哪些?
iOS正则表达式验证手机号、邮箱、身份证号等
Laravel如何实现API版本控制_Laravel版本化API设计方案
linux top下的 minerd 木马清除方法
如何在云服务器上快速搭建个人网站?

