关于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学习之第三方包安装方法(两种方法)
Jul 30 Python
详解Python中dict与set的使用
Aug 10 Python
基于Python的XSS测试工具XSStrike使用方法
Jul 29 Python
Python实现修改文件内容的方法分析
Mar 25 Python
使用python Telnet远程登录执行程序的方法
Jan 26 Python
python tkinter窗口最大化的实现
Jul 15 Python
如何运行带参数的python脚本
Nov 15 Python
Python编译成.so文件进行加密后调用的实现
Dec 23 Python
python实现门限回归方式
Feb 29 Python
python 实现PIL模块在图片画线写字
May 16 Python
keras 自定义loss model.add_loss的使用详解
Jun 22 Python
python opencv通过按键采集图片源码
May 20 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生成静态页面详解
2006/11/19 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(五)
2014/06/23 PHP
PHP字符串中抽取子串操作实例分析
2019/06/22 PHP
使用JQuery进行跨域请求
2010/01/25 Javascript
关于JavaScript定义类和对象的几种方式
2010/11/09 Javascript
Javascript实现滑块滑动改变值的实现代码
2013/04/12 Javascript
js和as的稳定传值问题解决
2013/07/14 Javascript
IE下双击checkbox反应延迟问题的解决方法
2014/03/27 Javascript
用html5 js实现点击一个按钮达到浏览器全屏效果
2014/05/28 Javascript
图解js图片轮播效果
2015/12/20 Javascript
Angularjs中ng-repeat-start与ng-repeat-end的用法实例介绍
2016/12/31 Javascript
微信小程序 本地图片按照屏幕尺寸处理
2017/08/04 Javascript
简单实现js上传文件功能
2017/08/21 Javascript
详解vue+vuex+koa2开发环境搭建及示例开发
2018/01/22 Javascript
webpack打包并将文件加载到指定的位置方法
2018/02/22 Javascript
vue axios 在页面切换时中断请求方法 ajax
2018/03/05 Javascript
Swiper 4.x 使用方法(移动端网站的内容触摸滑动)
2018/05/17 Javascript
用Object.prototype.toString.call(obj)检测对象类型原因分析
2018/10/11 Javascript
vue实现的组件兄弟间通信功能示例
2018/12/04 Javascript
详解Vue-Router源码分析路由实现原理
2019/05/15 Javascript
Vue使用Proxy监听所有接口状态的方法实现
2019/06/07 Javascript
vue实现多组关键词对应高亮显示功能
2019/07/25 Javascript
js中offset,client , scroll 三大元素知识点总结
2019/09/11 Javascript
es6函数name属性功能与用法实例分析
2020/04/18 Javascript
vue-iview动态新增和删除的方法
2020/06/17 Javascript
uniapp,微信小程序中使用 MQTT的问题
2020/07/11 Javascript
[06:07]刀塔密之二:攻之吾命受之吾幸
2014/07/03 DOTA
详解Python中的循环语句的用法
2015/04/09 Python
Python 基础教程之str和repr的详解
2017/08/20 Python
Python基于回溯法子集树模板解决0-1背包问题实例
2017/09/02 Python
python_opencv用线段画封闭矩形的实例
2018/12/05 Python
Python提取PDF内容的方法(文本、图像、线条等)
2019/09/25 Python
Python3.7 读取 mp3 音频文件生成波形图效果
2019/11/05 Python
英语文学专业学生的自我评价
2013/10/31 职场文书
模具设计与制造专业推荐信
2014/02/16 职场文书
安全生产管理责任书
2014/04/16 职场文书