关于Python字符编码与二进制不得不说的一些事


Posted in Python onOctober 04, 2020

二进制

核心思想:

冯诺依曼 + 图灵机

电如何表示状态,才能稳定?

计算机开始设计的时候并不是考虑简单,而是考虑能自动完成任务与结果的可靠性,

简单始终是建立再稳定、可靠基础上

经过尝试10进制,但很难检查电流的状态差异并且很难稳定状态,最稳定的检查是

通电和不通电状态,共两种状态那就规定 通电为 1 不通电 为 0,1和0的状态逻

辑被称为比特 Bit

那么如何用 0 和 1 表示数字和字符呢?

首先找出需要表示的字符,英文字符和数字字符才100多个,需要 7 个二进制位就

可以全部表示,但为了可扩展性,多出一位表示扩展,这就是ASCII码

因为一个字符只需要最多8个二进制位表示,所以规定8个字节作为存储单位,所有

8 Bit = 1 Byte

规定字符用数字表示,数字用二进制表示,也就是 字符 --> 数字 -- > 二进制,

那么文本信息就可以通过计算机存储为二进制,计算机上存储的二进制数可以逆转

成文本信息

10 进制到二进制之间的关系转换是固定的,那么字符到数字之间的转换被我们称为

字符编码, ASCII码 Unicode UTF-8 都是存储字符与数字之间的映射关系

 弄清楚几个关系

1. 字符与数字之间的关系为映射关系,人为规定的标准

    这种映射关系,生活中普遍存在,如

a. 身份证信息与身份证号码

b. 数据库id与该行信息

c. 订单信息与订单编号

d. 员工编号与员工

e. 字典的键与值

f. 内存地址与存储在该地址上的值

...

2. 数字到二进制之间的关系,这个如同数学或物理定律一样,固定转换方式,写死的

3. 8进制 16 进制都是建立在2进制的基础上,和10进制之间没有直接关系,主要为了

 可读性,二进制的两种表示形式

 如二进制 00000000 一个存储单位,八进制000 000 000 每 3 个二进制位转

 换位10进制表示,最小数为 0 最大数为 7,所以取值范围为 0 - 7

 十六进制 0000 0000 每 4个二进制位转换位10进制表示,最小位为0 最大为15,

 所有取值范围为 0 - 15,因为超出10机制表示范围所以用 abcdef表示 10 11

 12 13 14 15

   十六进制常用于 内存地址表示 IPv6地址 颜色表 mac地址 二进制数据\x前缀b/B

    IP地址(32位 点分十进制) x.x.x.x 每个x都是8个bit位表示的十进制数字

# 8进制 16进制是建立在二进制的基础之上

Py进制转换函数

10进制转其他进制

转2进制 bin 前缀0b

转16进制 hex 前缀0x

转8进制 oct 前缀0o

# 二进制 八进制 十六进制都是通过带前缀的字符串形式"0b/o/x..."

# 10 进制转其他进制
number = 9999
print("10进制转其他进制".ljust(40, "*"))
# 10 进制转2进制
b_number = bin(number)
print("二进制:", b_number)
# 10进制转8进制
o_number = oct(number)
print("八进制:", o_number)
# 10进制转16进制
h_number = hex(number)
print("十六进制:", h_number)

其他进制转10进制 int(..., base) base指定进制

# 10 进制转其他进制
number = 9999
print("10进制转其他进制".ljust(40, "*"))
# 10 进制转2进制
b_number = bin(number)
print("二进制:", b_number)
# 10进制转8进制
o_number = oct(number)
print("八进制:", o_number)
# 10进制转16进制
h_number = hex(number)
print("十六进制:", h_number)
 
# 其他进制转10进制
# 2进制转10进制
num_b = int(b_number, base=2)
print(num_b)
# 8 进制转10进制
num_o = int(o_number, base=8)
print(num_o)
# 8 进制转16进制
num_h = int(h_number, base=16)
print(num_h)

字符串转二进制字符串

bytes

encode

需要指定字符编码,结果前缀为 b/B"..."

# 字符串转二进制字符串
song = "你骄傲的飞远,我栖息的夏天"
 
byte_song = song.encode(encoding="utf-8")
print(byte_song)
# 等价于
eq_byte_song = bytes(song, encoding="utf-8")
print(eq_byte_song)
print(byte_song == eq_byte_song)

二进制转字符串

decode

str

需要指定字符编码

# 二进制转字符串
song = "你骄傲的飞远,我栖息的夏天"
# 获得二进制数据
byte_song = song.encode(encoding="utf-8")
print(byte_song)
 
# 二进制字符串转文本字符串
print("二进制数据转字符串".rjust(40, "_"))
dec_song = byte_song.decode(encoding="utf-8")
print(dec_song)
# 等价于'
str_song = str(byte_song, encoding="utf-8")
print(str_song)
print(dec_song == str_song)

算术方法

10进制转2 8 16进制,辗转除法取余数

其他进制转10进制是从右往左加上基数的指定次方然后求和

# 转换方式像公式定律,固定

 二进制表示

分为有符号和无符号类型,一般是 8 16 32 64 Bit 表示整数或浮点数

有符号最高位表示符号,就是最左边的比特位,0表示正1表示负数 正负下标位0和1

有符号位表示范围,因为要分成两半,一半表示正数一半表示负数,

说白了是去除一位表示符号位 -2**(n-1) - 2**n(n-1) -1, n = 8/16/32/64

无符号位表示 0到2**n -1

# 长度不一样,分为1/2/4/8字节

Py字符对应ASCII数字函数

ord()

字符编码

语言文字 ---> 数字 ---> 0 1二进制

# 这个映射关系表被称为字符编码

# 字符编码解决的问题是字符与十进制之间映射关系,人为定义的

中国 gb2312 -> GBK 中文2字节,英文1个字节

国际 Unicode(2-4个字节) -> UTF-8(1-4个字节)

1. 支持全球语言字符

2. 包含全球字符编码映射

# 全球各国语言可以转成Unicode,Unicode可以转全球各个国家语言

3. 全球软/硬件都支持Unicode

主流 UTF-8

因为Unicode表示一个字符需要至少2个字节,那么原来用ASCII只需要一个字节,

现在使用Unicode编码则存储与进行网络传输需要的存储空间直接翻倍,不可接受

UTF-8为了解决这个问题,于是走上了历史舞台,那好,网络传输和存储使用

UTF-8,操作系统支持Unicode,那么高效传输、存储和支持全球语言体系成为可能

Python中编码

首先说说Python中编码到底是何方神圣?

我们看存储代码的文件和代码加载到内存然后被解释器处理的文件

我们敲的代码,其实本质上是文本数据

文本数据要通过某一编码表转换成二进制然后存储到硬盘上

存储在电脑上的二进制数据也需要编码表才能转换成文本数据

Python中编码是怎么回事?

Py3中默认文件编码为UTF-8, 我们通过编辑器编辑文件的时候也会有个默认编码

一般默认为UTF-8,如果定义的文件中文本数据不是以UTF-8编码,则需要在Py文

件的头行告诉Py解释器这个文件是以何种编码。

解释器读取的并不是我们看到的编辑器里面的文本数据,而是存储在硬盘上的01

一样的二进制数据,解释器尝试用默认UTF-8编码解码读取到硬盘中的二进制数

据,转换成文件数据,如果非默认utf-8则出现乱码,解释器对文本数据解析失败,

则需要在Py源文件开头指定当前文件的编码格式,告诉Py解释器如何去转换该文件

Py解释器默认编码是Unicode,解释器会把读取到的二进制数据通过字符编码转

换成文件数据然后再次转换为Unicode编码,只要操作系统支持Unicode,解释器

都能正常执行并输出结果

解释器

二进制数据 -> 查字符编码表 -> 文本数据 -> Unicode编码的文本数据

编辑器

二进制数据 -> 查字符编码表 -> 对应编码表的文本数据

# 解释器和编辑器都是从文件的二进制数据开始的,通过编码转换成对应的文本

# 数据,不过解释器会会在文件数据的基础上解析文本数据成底层机器指令并执行

需要弄清楚的是Py源文件编码和Py解释器默认编码不一致

# Py源文件编码默认UTF-8,Py解释器默认编码为Unicode

那么,产生乱码的解决问题的思路就很好解决了

# 乱码 - 字符编码指定错误,存储的二进制转换成文本文件选择的字符集错误

1. C/S 架构的软件,检查 Client 和 Server默认编码是否一致

2. Web后端,数据库默认编码、表的编码和各个语言连接数据库接口的编码是否一致

3. 文件,检查编辑器的默认编码是否和文件初始编码一致,什么编码就存什么编码读

Python声明源文件字符编码的方式

1. # conding:utf-8

2. # -*- conding:utf-8 -*-

# 都是以 # 开头,写在源文件顶行

# -*- coding:utf-8 -*-
# coding: utf-8

总结

到此这篇关于关于Python字符编码与二进制不得不说的一些事的文章就介绍到这了,更多相关Python字符编码与二进制内容请搜索三水点靠木以前的文章或继续浏览下面的相关文章希望大家以后多多支持三水点靠木!

Python 相关文章推荐
python调用新浪微博API项目实践
Jul 28 Python
详解Python中__str__和__repr__方法的区别
Apr 17 Python
python编程线性回归代码示例
Dec 07 Python
python导入csv文件出现SyntaxError问题分析
Dec 15 Python
简单了解什么是神经网络
Dec 23 Python
Python实现的径向基(RBF)神经网络示例
Feb 06 Python
python 实现对文件夹内的文件排序编号
Apr 12 Python
Python实现将Excel转换成为image的方法
Oct 23 Python
Python 转换RGB颜色值的示例代码
Oct 13 Python
浅析python中while循环和for循环
Nov 19 Python
pytorch 多分类问题,计算百分比操作
Jul 09 Python
Python爬虫之Selenium下拉框处理的实现
Dec 04 Python
Python实现EM算法实例代码
Oct 04 #Python
python em算法的实现
Oct 03 #Python
浅析Python中字符串的intern机制
Oct 03 #Python
Python实现AES加密,解密的两种方法
Oct 03 #Python
python实现AdaBoost算法的示例
Oct 03 #Python
Django创建一个后台的基本步骤记录
Oct 02 #Python
Python中qutip用法示例详解
Oct 02 #Python
You might like
用Php编写注册后Email激活验证的实例代码
2013/03/11 PHP
PHP访问数据库集群的方法小结
2016/03/14 PHP
微信随机生成红包金额算法php版
2016/07/21 PHP
CI(CodeIgniter)框架视图中加载视图的方法
2017/03/24 PHP
ExtJS 2.0实用简明教程 之ExtJS版的Hello
2009/04/29 Javascript
javascript 年月日联动实现核心代码
2009/12/21 Javascript
JavaScript禁止页面操作的示例代码
2013/12/17 Javascript
jQuery操作DOM之获取表单控件的值
2015/01/23 Javascript
第一次接触JS require.js模块化工具
2016/04/17 Javascript
js实现table添加行tr、删除行tr、清空行tr的简单实例
2016/10/15 Javascript
AngularJS入门教程之Cookies读写操作示例
2016/11/02 Javascript
Vue组件tree实现树形菜单
2017/04/13 Javascript
JS实现的简单标签点击切换功能示例
2017/09/21 Javascript
微信小程序map组件结合高德地图API实现wx.chooseLocation功能示例
2019/01/23 Javascript
vue实现图片上传预览功能
2019/12/23 Javascript
Vue通过Blob对象实现导出Excel功能示例代码
2020/07/31 Javascript
[09:31]2016国际邀请赛中国区预选赛Yao赛后采访 答题送礼
2016/06/27 DOTA
[49:43]VG vs FNATIC 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/17 DOTA
详解python3中tkinter知识点
2018/06/21 Python
tensorflow使用神经网络实现mnist分类
2018/09/08 Python
Windows系统下PhantomJS的安装和基本用法
2018/10/21 Python
使用PyInstaller将Pygame库编写的小游戏程序打包为exe文件及出现问题解决方法
2019/09/06 Python
解决Numpy中sum函数求和结果维度的问题
2019/12/06 Python
python绘制彩虹图
2019/12/16 Python
python 6.7 编写printTable()函数表格打印(完整代码)
2020/03/25 Python
python连接mysql有哪些方法
2020/06/24 Python
Champion官网:美国冠军运动服装
2017/01/25 全球购物
大学生自我评价怎样写好
2013/10/23 职场文书
班级旅游计划书
2014/05/03 职场文书
房屋出租协议书范本(标准版)
2014/09/24 职场文书
小学教师2014年度工作总结
2014/12/03 职场文书
五四青年节活动总结
2015/02/10 职场文书
专职安全员岗位职责
2015/04/11 职场文书
垂直极限观后感
2015/06/08 职场文书
机关干部作风整顿心得体会
2016/01/22 职场文书
Java多线程并发FutureTask使用详解
2022/06/28 Java/Android