关于Python字符编码与二进制不得不说的一些事
作者:北门吹雪 发布时间:2022-01-07 14:56:46
二进制
核心思想:
冯诺依曼 + 图灵机
电如何表示状态,才能稳定?
计算机开始设计的时候并不是考虑简单,而是考虑能自动完成任务与结果的可靠性,
简单始终是建立再稳定、可靠基础上
经过尝试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
来源:https://www.cnblogs.com/2bjiujiu/p/13762909.html
猜你喜欢
- 软件版本:apache:Apache 2.4.6 Win64 PHP:PHP 5.5 VC11 x64 Non Thr
- 例1:#!/usr/bin/perluse strict; use warnings;my $test = "asdf"
- 今天给大家分享Listary v5.00.2843 2022年6月9日亲测可用注册码 ,是一款最新的激活码,有需要的朋友前来查看。Lista
- 最近在使用webpack + vue做个人娱乐项目时,发现npm run build后,css js img静态资源文件均找不到路径,报40
- 一、题意理解给定两棵树T1和T2。如果T1可以通过若干次左右孩子互换就变成T2,则我们称两棵树是“同构的”。现给定两棵树,请你判断它们是否是
- python保存文本文件的方法:使用python内置的open()类可以打开文本文件,向文件里面写入数据可以用write()函数,写完之后,
- 前言大家好,我是苏凉,在前面我们已经学习了网络爬虫并且获取到了数据,接下来当然是对数据进行分析啦,本篇文章带大家进入新的模块:pyhon数据
- 今晚想实现这样一个功能:将输入字符串中的字母 “i” 变成字母 “p”。当时想的很简单,直接用for循环遍历,然后替代,出问题的代码如下:n
- 我们先看一下浅复制的缺陷,不知多少人中过招呢? var oOriginal = { memNum: 1, // number memStr:
- 在实际使用的时候,我们如何灵活的在存储过程中运用它们,虽然它们实现的功能基本上是一样的,可如何在一个存储过程中有时候去使用临时表而不使用表变
- 算法是计算机科学中一个重要的研究方向,是解决复杂问题的关键。在计算机世界中,算法无处不在。数据库是存储数据和执行大批量计算的场所,在数据库中
- 一、安装第三方库是可能出现如下错误提示:二、解决办法:最好的解决办法可以通过“Pycharm”左下角
- 首先简单介绍一下什么叫MySQL;数据库简而言之就是存储数据的仓库,为了方便数据的存储和管理,它将数据按照特定的规律存储在磁盘上。是为了实现
- 1. 背景在使用selenium浏览器渲染技术,爬取网站信息时,一般来说,速度是很慢的。而且一般需要用到这种技术爬取的网站,反爬技术都比较厉
- py读写修改常用的三种方法xlwt:用于写入 Excel 文件xlrd:用于读取 Excel 文件xlutils:用于操作 Excel 文件
- 一:C# 连接SQL数据库 Data Source=myServerAddress;Initial Catalog=
- 经常碰到的一个问题是limit的offset太高,如:limit 100000,20,这样系统会查询100020条,然后把前面的
- 当变量维数加大时很难想象是怎样按不同维度求和的,高清楚一个,其他的应该就很清楚了,什么都不说了,上例子,例子一看便明白…..a=range(
- 1、文档使用numpy的 concatenate 拼接矩阵,文档里面这样解释:numpy.concatenate((a1, a2, ...)
- 很多朋友在做特效网页的时候需要用到雪花飘落的效果,我们这里给大家整理了分别用JS还有JQuery两种代码实现这个效果的方式。我们先来看一下需