老生常谈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


相关推荐: EditPlus中的正则表达式 实战(2)  惠州网站建设制作推广,惠州市华视达文化传媒有限公司怎么样?  如何在万网自助建站中设置域名及备案?  java获取注册ip实例  C++用Dijkstra(迪杰斯特拉)算法求最短路径  UC浏览器如何设置启动页 UC浏览器启动页设置方法  在线教育网站制作平台,山西立德教育官网?  如何用免费手机建站系统零基础打造专业网站?  canvas 画布在主流浏览器中的尺寸限制详细介绍  创业网站制作流程,创业网站可靠吗?  昵图网官方站入口 昵图网素材图库官网入口  javascript中的try catch异常捕获机制用法分析  浅析上传头像示例及其注意事项  Laravel如何保护应用免受CSRF攻击?(原理和示例)  javascript事件捕获机制【深入分析IE和DOM中的事件模型】  高防服务器如何保障网站安全无虞?  Laravel全局作用域是什么_Laravel Eloquent Global Scopes应用指南  电商网站制作价格怎么算,网上拍卖流程以及规则?  C#如何调用原生C++ COM对象详解  Laravel模型关联查询教程_Laravel Eloquent一对多关联写法  Laravel如何从数据库删除数据_Laravel destroy和delete方法区别  如何快速搭建高效WAP手机网站吸引移动用户?  Java解压缩zip - 解压缩多个文件或文件夹实例  Laravel如何安装Breeze扩展包_Laravel用户注册登录功能快速实现【流程】  如何在橙子建站上传落地页?操作指南详解  移动端手机网站制作软件,掌上时代,移动端网站的谷歌SEO该如何做?  常州企业网站制作公司,全国继续教育网怎么登录?  linux写shell需要注意的问题(必看)  详解免费开源的.NET多类型文件解压缩组件SharpZipLib(.NET组件介绍之七)  如何挑选最适合建站的高性能VPS主机?  jquery插件bootstrapValidator表单验证详解  Android中Textview和图片同行显示(文字超出用省略号,图片自动靠右边)  Mybatis 中的insertOrUpdate操作  Python高阶函数应用_函数作为参数说明【指导】  如何在沈阳梯子盘古建站优化SEO排名与功能模块?  打开php文件提示内存不足_怎么调整php内存限制【解决方案】  用v-html解决Vue.js渲染中html标签不被解析的问题  JS实现鼠标移上去显示图片或微信二维码  Laravel如何清理系统缓存命令_Laravel清除路由配置及视图缓存的方法【总结】  Laravel如何监控和管理失败的队列任务_Laravel失败任务处理与监控  Laravel如何实现文件上传和存储?(本地与S3配置)  Laravel怎么创建控制器Controller_Laravel路由绑定与控制器逻辑编写【指南】  如何快速搭建个人网站并优化SEO?  猪八戒网站制作视频,开发一个猪八戒网站,大约需要多少?或者自己请程序员,需要什么程序员,多少程序员能完成?  如何在云主机快速搭建网站站点?  简单实现Android验证码  如何在局域网内绑定自建网站域名?  Android实现代码画虚线边框背景效果  网站视频制作书签怎么做,ie浏览器怎么将网站固定在书签工具栏?  ChatGPT常用指令模板大全 新手快速上手的万能Prompt合集