关于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中的列表推导浅析
Apr 26 Python
Python解析网页源代码中的115网盘链接实例
Sep 30 Python
用Python进行基础的函数式编程的教程
Mar 31 Python
Python+Pika+RabbitMQ环境部署及实现工作队列的实例教程
Jun 29 Python
Django objects.all()、objects.get()与objects.filter()之间的区别介绍
Jun 12 Python
Python中static相关知识小结
Jan 02 Python
浅谈Python里面小数点精度的控制
Jul 16 Python
python 如何将数据写入本地txt文本文件的实现方法
Sep 11 Python
python使用yield压平嵌套字典的超简单方法
Nov 02 Python
Python使用socketServer包搭建简易服务器过程详解
Jun 12 Python
如何用python爬取微博热搜数据并保存
Feb 20 Python
Python数据可视化之用Matplotlib绘制常用图形
Jun 03 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+mysql保存和输出文件
2006/10/09 PHP
php访问查询mysql数据的三种方法
2006/10/09 PHP
PHP原理之异常机制深入分析
2010/08/08 PHP
php中取得URL的根域名的代码
2011/03/23 PHP
php缓存技术详细总结
2013/08/07 PHP
jQuery Mobile + PHP实现文件上传
2014/12/12 PHP
Zend Framework动作助手Url用法详解
2016/03/05 PHP
Yii使用DeleteAll连表删除出现报错问题的解决方法
2016/07/14 PHP
thinkPHP统计排行与分页显示功能示例
2016/12/02 PHP
javaScript parseInt字符转化为数字函数使用小结
2009/11/05 Javascript
js过滤数组重复元素的方法
2010/09/05 Javascript
一行代码实现纯数据json对象的深度克隆实现思路
2013/01/09 Javascript
JQuery的常用选择器、过滤器、方法全面介绍
2016/05/25 Javascript
Bootstrap源码解读排版(1)
2016/12/23 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
详解nodejs微信公众号开发——2.自动回复
2017/04/10 NodeJs
JavaScript数组排序reverse()和sort()方法详解
2017/12/24 Javascript
一个Vue页面的内存泄露分析详解
2018/06/25 Javascript
vue按需加载实例详解
2019/09/06 Javascript
vue-quill-editor 自定义工具栏和自定义图片上传路径操作
2020/08/03 Javascript
[01:14]辉夜杯战队访谈宣传片—NEWBEE.Y
2015/12/26 DOTA
[46:48]DOTA2上海特级锦标赛A组小组赛#2 Secret VS CDEC第三局
2016/02/25 DOTA
Python实现字符串匹配算法代码示例
2017/12/05 Python
Python实现自动上京东抢手机
2018/02/06 Python
python中的闭包函数
2018/02/09 Python
Pycharm 操作Django Model的简单运用方法
2018/05/23 Python
Python实现朴素贝叶斯的学习与分类过程解析
2019/08/24 Python
Python使用sqlite3模块内置数据库
2020/05/07 Python
python统计mysql数据量变化并调用接口告警的示例代码
2020/09/21 Python
德国汽车零件和汽车配件网上商店:kfzteile24
2018/11/14 全球购物
初中物理教学反思
2014/01/14 职场文书
机关中层领导干部群众路线教育实践活动个人对照检查材料
2014/09/24 职场文书
结婚通知短信怎么写
2015/04/17 职场文书
如何制定销售人员薪酬制度?
2019/07/09 职场文书
超详细教你怎么升级Mysql的版本
2021/05/19 MySQL
python中 Flask Web 表单的使用方法
2022/05/20 Python