关于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实现系统状态监测和故障转移实例方法
Nov 18 Python
python通过zlib实现压缩与解压字符串的方法
Nov 19 Python
利用Python绘制数据的瀑布图的教程
Apr 07 Python
Python中进程和线程的区别详解
Oct 29 Python
tf.truncated_normal与tf.random_normal的详细用法
Mar 05 Python
Python I/O与进程的详细讲解
Mar 08 Python
django框架使用方法详解
Jul 18 Python
Django CBV与FBV原理及实例详解
Aug 12 Python
python两个_多个字典合并相加的实例代码
Dec 26 Python
Appium+Python实现简单的自动化登录测试的实现
Jan 26 Python
Pytorch 如何加速Dataloader提升数据读取速度
May 28 Python
Python turtle编写简单的球类小游戏
Mar 31 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随机数生成代码与使用实例分析
2011/04/08 PHP
Pain 全世界最小最简单的PHP模板引擎 (普通版)
2011/10/23 PHP
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
PHP SESSION机制的理解与实例
2019/03/22 PHP
PHP中Static(静态)关键字功能与用法实例分析
2019/04/05 PHP
DHTML Slide Show script图片轮换
2008/03/03 Javascript
javascript 字符 Escape,encodeURI,encodeURIComponent
2009/07/09 Javascript
javascript 面向对象编程  function是方法(函数)
2009/09/17 Javascript
javascript下判断一个对象是否具有指定名称的属性的的代码
2010/01/11 Javascript
使用jQuery+HttpHandler+xml模拟一个三级联动的例子
2011/08/09 Javascript
jquery获取一组checkbox的值(实例代码)
2013/11/04 Javascript
jquery的trigger和triggerHandler的区别示例介绍
2014/04/20 Javascript
setTimeout内不支持jquery的选择器的解决方案
2015/04/28 Javascript
javascript获取网页宽高方法汇总
2015/07/19 Javascript
自己封装的一个简单的倒计时功能实例
2016/11/23 Javascript
Angular.js组件之input mask对input输入进行格式化详解
2017/07/10 Javascript
Vue中computed与methods的区别详解
2018/03/24 Javascript
微信小程序tabBar 返回tabBar不刷新页面
2019/07/25 Javascript
[49:08]完美世界DOTA2联赛PWL S2 LBZS vs FTD.C 第一场 11.27
2020/12/01 DOTA
Python微信公众号开发平台
2018/01/25 Python
python实现简易通讯录修改版
2018/03/13 Python
python如何实现反向迭代
2018/03/20 Python
Python实现图片拼接的代码
2018/07/02 Python
对于Python深浅拷贝的理解
2019/07/29 Python
Python3 chardet模块查看编码格式的例子
2019/08/14 Python
在Python中画图(基于Jupyter notebook的魔法函数)
2019/10/28 Python
哈工大自然语言处理工具箱之ltp在windows10下的安装使用教程
2020/05/07 Python
Python字符串split及rsplit方法原理详解
2020/06/29 Python
Martinelli官方商店:西班牙皮鞋和高跟鞋品牌
2019/07/30 全球购物
介绍一下Java的事务处理
2012/12/07 面试题
Java servlet面试题
2012/03/04 面试题
完美主义个人的自我评价
2014/02/17 职场文书
党的群众路线教育实践活动宣传方案
2014/02/23 职场文书
个人债务授权委托书
2014/10/17 职场文书
再婚婚前财产协议书范本
2014/10/19 职场文书
SpringBoot中使用Redis作为全局锁示例过程
2022/03/24 Java/Android