[Python学习日记-21] Python 中的字符编码(上)

news2024/11/22 11:19:06

[Python学习日记-21] Python 中的字符编码(上)

简介

ASCII 码

字符编码中的断句

GB2312 和 GBK

简介

        在编程之路上,如果你不把编码问题搞清楚,那么它将像幽灵一般纠缠你整个职业生涯,各种灵异事件会接踵而来(页面乱码之类的),挥之不去。只有充分发挥程序员死磕到底的精神你才有可能彻底摆脱编码问题带来的烦恼。

        在[Python学习日记-20] 彻底搞懂二进制中我们已经知道了计算机只读得懂二进制,并且学会了二进制转换为十进制的方法,但是据我们所知,计算机显示的并不是全是数字啊,包括我们现在所看到的这篇文章,都是中英文混合的,可是文字应该怎么转换成数字呢?其实计算机执行的就是比较除暴的强制转换。科学家在面临这个问题的时候强行约定了一个表,把文字和数字对应上,这张表就相当于翻译,可以拿着一个数字来对比对应表找到相应的文字,反之亦然。而最初出现的就是 ASCII 码表

ASCII 码

        下面这张表就是计算机显示各种文字、符号的基石

        ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是基于拉丁字母的一套电脑编码系统,主要用于显示现代英语和其他西欧语言。它是现今最通用的单字节编码系统,并等同于国际标准 ISO/IEC 646。由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母、数字和一些符号,这个编码表被称为 ASCII 编码,比如大写字母 A 的编码是65,小写字母 z 的编码是122。后128个称为扩展 ASCII 码。在 Python 中可以使用 ord() 方法来查询字符的 ASCII 编码

print(ord('a'))
print(ord('A'))
print(ord('0'))
print(ord(0))

代码输出如下:   

        需要注意的是,计算机当中0和'0'并不是一样的东西,前者是 int (整数)类型,而后者是字符类型。那现在我们就知道了上面的字母符号和数字对应的表是早就存在的。那么根据现在有的一些十进制数字,我们就可以转换成成二进制编码串了,编码之间的转换如下

一个空格对应的数字是0                        翻译成二进制就是0(注意字符'0'和整数0是不同的)

一个对勾√对应的数字是251                  翻译成二进制就是11111011

        大家都清楚计算机的数据都是一个包一个包的并不是单独一个个的就像下图那样

         那现在就面临一个问题了,我们怎么知道哪里到哪里是表达一个字符呢?这就要说到断句的重要性了

字符编码中的断句

        先看个句子:“我一定要当上海贼王!”

        这句话你第一时间想到的意思是什么呢?是“我一定要当上,海贼王!”还是“我一定要当,上海贼王!”,可以看出由于断句的不同一句话是可以表达两种意思的,而在中文当中我们的断句方式就是使用各种标点符号进行断句,而在计算机中就不能加各种标点符号了,这是因为计算机只能读懂 0 和 1。

        那计算机到底是怎么进行断句的呢?从 ASCII 码表当中可以看出,越是靠前的字符对应的二进制编码都是越短的,而后面的字符编码就是更长的,正是由于这些字符串长的长,短的短,写在一起让我们难以分清每一个字符的起止位置,所以聪明的人类就想出了一个解决办法,既然一共就这255个字符,那最长的也不过是八位二进制(11111111),不如我们就把所有的二进制都转换成8位的,不足的用0来替换。

        这样一来,刚刚的两个空格一个对勾就写作000000000000000011111011,读取的时候只要每次读8个二进制位就能能知道每个字符的二进制值了,其中每一位0或者1所占的空间单位为 bit (比特),这是计算机中最小的表示单位,而每8个 bit 组成一个字节,这是计算机中最小的存储单位了,计算机中存储单位如下

bit                                位,计算机中最小的表示单位

8bit = 1bytes               (KiloByte)一字节,最小的存储单位,1bytes 缩写为 1B

1KB = 1024B              (MegaByte)兆字节

1MB = 1024KB           (GigaByte)吉字节

1GB = 1024MB           (TeraByte)太字节

1TB = 1024GB            (PetaByte)拍字节

1PB = 1024TB            (ExaByte)艾字节

1EB = 1024PB            (ZetaByte)泽字节

1ZB = 1024EB            (YottaByte)尧字节

1YB = 1024ZB            (Brontobyte)珀字节

1BB = 1024YB            (NonaByte) 诺字节

1NB = 1024BB            (NonaByte) 诺字节;

1DB = 1024NB            (DoggaByte)刀字节。

GB2312 和 GBK

         随着时代的发展中国人开始使用上了电脑,上面的 ASCII 码是解决了英文字符的转码问题,那我们中文应该怎么解决呢?显然美国人在设计 ASCII 码时并没有考虑到中国人有一天能用上电脑,所以根本没考虑中文的问题。上个世纪80年代,电脑进入中国,把专家们都难倒了,一个 ASSCII 码使用 8bit 只能存256个字符,我常用汉字就几千个,使用 ASCII 码是根本装不下的。既然用不了于是我们另辟蹊径自己设计出了了 GB2312 编码表,一共存了6763个汉字,基本满足了我们日常所需,它就长下面的样子

code +0 +1 +2 +3 +4 +5 +6 +7+8 +9+A+B +C +D +E +F
B4A0 础 储 矗 搐 触 处 揣 川 穿 椽 传 船 喘 串 疮
B4B0 窗 幢 床 闯 创 吹 炊 捶 锤 垂 春 椿 醇 唇 淳 纯
B4C0 蠢 戳 绰 疵 茨 磁 雌 辞 慈 瓷 词 此 刺 赐 次 聪
B4D0 葱 囱 匆 从 丛 凑 粗 醋 簇 促 蹿 篡 窜 摧 崔 催
B4E0 脆 瘁 粹 淬 翠 村 存 寸 磋 撮 搓 措 挫 错 搭 达
B4F0 答 瘩 打 大 呆 歹 傣 戴 带 殆 代 贷 袋 待 逮

code +0 +1 +2 +3 +4 +5 +6 +7+8 +9+A+B +C +D +E +F
B5A0 怠 耽 担 丹 单 郸 掸 胆 旦 氮 但 惮 淡 诞 弹
B5B0 蛋 当 挡 党 荡 档 刀 捣 蹈 倒 岛 祷 导 到 稻 悼
B5C0 道 盗 德 得 的 蹬 灯 登 等 瞪 凳 邓 堤 低 滴 迪
B5D0 敌 笛 狄 涤 翟 嫡 抵 底 地 蒂 第 帝 弟 递 缔 颠
B5E0 掂 滇 碘 点 典 靛 垫 电 佃 甸 店 惦 奠 淀 殿 碉

B5F0 叼 雕 凋 刁 掉 吊 钓 调 跌 爹 碟 蝶 迭 谍 叠

code +0 +1+2 +3+4 +5+6+7+8 +9 +A+B +C +D +E +F
B6A0 丁 盯 叮 钉 顶 鼎 锭 定 订 丢 东 冬 董 懂 动
B6B0 栋 侗 恫 冻 洞 兜 抖 斗 陡 豆 逗 痘 都 督 毒 犊
B6C0 独 读 堵 睹 赌 杜 镀 肚 度 渡 妒 端 短 锻 段 断
B6D0 缎 堆 兑 队 对 墩 吨 蹲 敦 顿 囤 钝 盾 遁 掇 哆
B6E0 多 夺 垛 躲 朵 跺 舵 剁 惰 堕 蛾 峨 鹅 俄 额 讹

......

        这个表格比较大,像上面的一块块的文字区域有72个之多,这导致通过一个字节是没办法表示一个汉字的(因为一个字节最多允许256个字符变种,而现在有6千多个之多,只能使用2个字节进行表示,2**16=65535个变种),自从有了 GB2312 我们就可以愉快的在计算机当中写中文了。

        常看文章的小伙伴都会发现,文章当中偶尔会出现中英混杂的情况,比如“我在上海,上海 city 不 city 啊!”,这种情况就要求 GB2312 必须同时支持中英文,但是还不能是2个字节表示一个英文字母。这是因为人家 ASCII 码只需要用一个字符就能表示,而 GB2312 需要用2个,那每使用 GB2312 存储一个英文字符需要的存储空间就是 ASCII 码的两倍,例如有一个 2MB 大小的英文文档只要一改编码,就立刻变成 4MB,如果有上万份这种类型的文档,足足有一半的空间都是浪费的,这样搞地主家也没有余粮呀。所以中国专家们左思右想,最终想到了一种办法及兼容了ASCII码(即遇到中文用2个字节,遇到英文直接用ASCII的编码)。

        它是如何实现的呢?这个关键就在于如何区别连在一起的2个字节是代表2个英文字母,还是一个中文汉字了。最后专家们把目光放到了扩展 ASCII 码上,因为他们发现 ASCII 码后面的极特殊的字符是很少用到的,如果用到了也能使用 GB2312 上的来代替,并且不会造成大量存储空间被浪费的现象,于是决定如果2个字节连在一起,且每个字节的第1位(也就是相当于128的那个2进制位)如果是1,就代表这是个中文,这个首位是128的字节被称为高字节。也就是2个高字节连在一起,必然就是一个中文。
        自1980年发布 GB2312 之后,中文一直用着没啥问题,随着个人电脑进入千家万户,有人发现,自己的名字竟然打印不出来,因为有的姓或者是名太生僻了。于是1995年,专家们又升级了 GB2312,加入了更多字符,甚至连藏语、维吾尔语、日语、韩语、蒙古语等等的统统都包含进去了,可想而知当时国家开发 GBK 是想服务整个亚洲的。而这个编码就叫做 GBK,它支持21000多个汉字,一直到现在,我们的 Windows 系统中文版本的编码就是 GBK。

        这就是20世纪关于字符编码的一些事了,在[Python学习日记-22] Python 中的字符编码(下)我们将讲述 unicode 和 utf-8 的那些事。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2137447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

除了字符串前导的*号之外,将串中其它*号全部删除

要求 假定输入的字符串中只包含字母和*号。请编写函数fun,它的功能是:除了字符串前导的*号之外,将串中其它*号全部删除。在编写函数时,不得使用C语言提供的字符串函数。函数fun中给出的语句仅供参考。 例如,字符串中的内容为:-**…

文件格式转换:EXCEL和CSV文件格式互相转换

目录 1.EXCEl和CSV文件格式互相转换1.1首先安装所需的Python包1.2excel转换为csv代码如下:1.3csv转换为excel代码如下:由于excel文件在数学建模数据处理当中的局限性,我们通常把excel文件转换为csv文件来处理,下面是相关的代码,我直接封装成函数,你们直接调用即可,我会添…

Selenium基础入门:环境搭建、浏览器驱动配置及基本使用方法

目录 引言 一、Selenium环境搭建 1.1 Python环境准备 1.1.1 下载并安装Python 1.1.2 安装pip 1.2 Selenium库安装 1.3 浏览器驱动安装 1.3.1 ChromeDriver 1.3.2 GeckoDriver(Firefox) 1.3.3 其他浏览器驱动 1.4 IDE和插件(可选&a…

免费AI播客生成:notebooklm可以生成播客的两个发言人谈论的内容,从各种来源如研究论文、文章

参考: https://notebooklm.google.com/ 可以上传文章链接,ai自动生成播客两人对话: 另外notebooklm他本身也是个rag知识库对话,可以直接聊天框对话

CorrMatch复现

复现结果–Full:81.78327847863439,成功 U2PL’s splits计算量太大,不建议复现

Ubuntu 20.04 解决 nvidia-smi 出错问题

目录 一、初始问题 二、解决方法 2.1 法一 2.2 法二 三、新的问题 3.1 解决方案 3.2 进一步解决 3.3 最后解决 一、初始问题 今天要在本机上装个环境时,运行了一下 nvidia-smi 突然遇到一个问题: Failed to initialize NVML: Driver/library ver…

Qt_按钮类控件

目录 1、QAbstractButton 2、设置带图标的按钮 3、设置带有快捷键的按钮 4、QRadioButtion(单选按钮) 4.1 QButtonGroup 5、QCheckBox 结语 前言: 按钮类控件是Qt中最重要的控件类型之一,该类型的控件可以通过鼠标的点击…

了解线程池

引出线程池: 假设小编是一个女生,小编处了一个对象,但是某一天小编不想和这个男生处对象了,但是小编还是想和别的男生处对象的,于是现在我就面临两个问题:一、怎么跟现任分手 二、开始物色新的对象&#…

软件安装攻略:Sublime Text 下载安装和使用教程

Sublime Text 下载安装和使用教程 Sublime Text是一个流行的跨平台文本编辑器,它具有以下一些主要功能和特点: (1)简洁的界面和快速的速度:Sublime Text拥有简约干净的界面,启动和响应速度很快。 &#…

Visual Studio打开项目的一些小技巧

Visual Studio(VS)是一款功能强大的集成开发环境,许多刚入门C/C的小白也会使用这款软件进行写代码,然而它的操作并不简单,下面将讲解一下VS打开项目文件的一些小技巧。 目录 🎁创建空项目 ❤️①点击“创建新项目” ❤️②点击“…

Unity中InputField一些属性的理解

先看代码: using UnityEngine; using UnityEngine.UI;public class TestInput : MonoBehaviour {[SerializeField]InputField inputField;void Start(){Debug.Log(inputField.text);Debug.Log(inputField.text.Length);Debug.Log(inputField.preferredWidth);Debug…

Netty笔记02-组件EventLoop

文章目录 EventLoop概述EventLoop 的概念EventLoop 的作用EventLoop 的生命周期EventLoopGroupEventLoop 的工作原理总结 代码示例💡 优雅关闭演示 NioEventLoop 处理 io 事件解决work中的channel读操作耗费时间过长,影响其他channel(客户端)的问题&…

开源链动 2+1 模式 AI 智能名片与 S2B2C 商城小程序在用户运营中的应用

摘要: 本文深入探讨了用户运营中不同用户阶段的特点及策略,引入“开源链动 21 模式 AI 智能名片 S2B2C 商城小程序”,分析其在用户运营各个阶段的作用和价值,旨在为企业提供更高效的用户运营方案,实现用户价值的最大化…

Spring 框架——@Async 注解

目录 1.同步调用与异步调用1.1.同步调用1.2.异步调用1.3.总结 2.注解 Async 介绍2.1.用在方法上2.2.用在类上 3.使用演示3.1.在启动类或者配置类上增加 EnableAsync 注解3.2.在异步方法上增加 Async 注解3.3.调用异步方法3.4.测试3.5.其它说明 4.注意事项4.1.Async 注解失效的常…

【Qt绘图】—— 运用Qt进行绘图

目录 (一)基本概念 (二)绘制各种形状 2.1 绘制线段 2.2 绘制矩形 2.3 绘制圆形 2.4 绘制文本 2.5 设置画笔 2.6 设置画刷 (三)绘制图片 3.1 绘制简单图片 3.2 平移图片 3.3 缩放图片 3.4…

Linux 手动安装Ollama

Linux 离线安装Ollama 前言 不知道为什么 在阿里云服务器上 执行curl -fsSL https://ollama.com/install.sh | sh一键安装 非常慢 所以只能手动装了 1.到 https://ollama.com/install.sh 下载安装执行文件 修改其中 下载和安装部分代码 if curl -I --silent --fail --location…

Python数据分析-Numpy快速入门

一、什么是Numpy 二、 创建 Numpy ndarray对象 三、数组中的维度 1.各种维度数组 2.检查维度数 3.创建更高维度的数组 四、数组索引 1.访问数组元素 2.访问2-D数组元素 其他维度的同理 3.负索引 五、数据裁剪:要头不要尾 1.裁剪数组 demo: 2.负裁…

构建基于 Feign 的微服务:从 Eureka 到负载均衡的实践 --day05

目录 步骤1:创建父工程feign-1步骤2:改造服务提供者使用 RequestMapping使用 GetMapping 步骤3:改造服务消费者为Feign客户端(1)添加Feign依赖(2)添加EnableFeignClients注解(3&…

YoloV10 训练自己的数据集(推理,转化,C#部署)

目录 一、下载 三、开始训练 train.py detect.py export.py 超参数都在这个路径下 四、C#读取yolov10模型进行部署推理 如下程序是用来配置openvino 配置好引用后就可以生成dll了 再创建一个控件,作为显示 net framework 4.8版本的 再nuget工具箱里下载 …

thinkphp6开发的通用网站系统源码

thinkphp6开发的通用网站系统源码。 基于ThinkPHP6框架开发的通用后台权限管理系统,底层采用国内最流行的ThinkPHP6框架, 支持内容管理、文章管理、用户管理、权限管理、角色管理等功能。 代码下载