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

二进制

核心思想:

  冯诺依曼 + 图灵机

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

    计算机开始设计的时候并不是考虑简单,而是考虑能自动完成任务与结果的可靠性,
    简单始终是建立再稳定、可靠基础上

    经过尝试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字符编码与二进制内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Python二进制串转换为通用字符串的方法

    一个小问题 今天在做一个实验时,需要对一个包含中英文词汇的TXT文件进行读入和整理. Python代码的编码规则为UTF-8.在读入时,文件的每行是二进制串,形如: b'heroes\xff..... 在对每行进一步进行处理时,要求处理对象必须为通用字符串,所以: lineVec = str(line).strip().split('\t') 此时的lineVec的元素类型为string,但输出是仍然是 "b'heros\xff-.." ,仍然无法摆脱二进制标志的影响.然而,尴尬的是,

  • Python 内置函数进制转换的用法(十进制转二进制、八进制、十六进制)

    使用Python内置函数:bin().oct().int().hex()可实现进制转换. 先看Python官方文档中对这几个内置函数的描述: bin(x) Convert an integer number to a binary string. The result is a valid Python expression. If x is not a Python int object, it has to define an __index__() method that returns

  • Python获取系统默认字符编码的方法

    本文实例讲述了Python获取系统默认字符编码的方法.分享给大家供大家参考.具体分析如下: 在Python代码中,普通字符串的编码方式与程序源文件编码方式一致的,而很多IDE在默认情况下,将程序源文件按照系统默认字符编码来保存的. 下面给出用Python获取系统默认编码的例子: #!/usr/bin/env python #coding=utf-8 """ 获取系统默认编码 """ import sys print sys.getdefaulte

  • Python字符编码转码之GBK,UTF8互转

    一.Python字符编码介绍 1.须知: 在python 2中默认编码是 ASCII,而在python 3中默认编码是 unicode unicode 分为utf-32 (占4个字节),utf-16(占两个字节),utf-8(占1-4个字节),所以utf-16 是最常用的unicode版本,但是在文件里存的还是utf-8,因为utf8省空间 在python 3,encode编码的同时会把stringl变成bytes类型,decode解码的同时会把bytes类型变成string类型 在unicod

  • 使用Python进行二进制文件读写的简单方法(推荐)

    总的感觉,python本身并没有对二进制进行支持,不过提供了一个模块来弥补,就是struct模块. python没有二进制类型,但可以存储二进制类型的数据,就是用string字符串类型来存储二进制数据,这也没关系,因为string是以1个字节为单位的. import struct a=12.34 #将a变为二进制 bytes=struct.pack('i',a) 此时bytes就是一个string字符串,字符串按字节同a的二进制存储内容相同. 再进行反操作 现有二进制数据bytes,(其实就是字

  • Python3如何解决字符编码问题详解

    编码 因为计算机只能处理数字,如果要处理文本,就必须先把文本转换为数字才能处理.最早的计算机在设计时采用8个比特(bit)作为一个字节(byte),所以,一个字节能表示的最大的整数就是255(二进制11111111=十进制255),如果要表示更大的整数,就必须用更多的字节.比如两个字节可以表示的最大整数是65535,4个字节可以表示的最大整数是4294967295. 由于计算机是美国人发明的,因此,最早只有127个字母被编码到计算机里,也就是大小写英文字母.数字和一些符号,这个编码表被称为ASC

  • 使用Python读取二进制文件的实例讲解

    目标:目标文件为一个float32型存储的二进制文件,按列优先方式存储.本文使用Python读取该二进制文件并使用matplotlib.pyplot相关工具画出图像 工具:Python3, matplotlib,os,struct,numpy 1. 读取二进制文件 首先使用open函数打开文件,打开模式选择二进制读取"rb". f = open(filename, "rb") 第二步,需要打开按照行列读取文件,由于是纯二进制文件,内部不含邮任何的数据结构信息,因此我

  • 解决Python3中的中文字符编码的问题

    python3中str默认为Unicode的编码格式 Unicode是一32位编码格式,不适合用来传输和存储,所以必须转换成utf-8,gbk等等 所以在Python3中必须将str类型转换成bytes类型的 在Python中使用encode的方式可以进行字符的编码 实际用法: >>>a = "中国" >>> a.encode("utf-8") b'\xe4\xb8\xad\xe5\x9b\xbd' >>> a.

  • 跟老齐学Python之坑爹的字符编码

    字符编码,在编程中,是一个让学习者比较郁闷的东西,比如一个str,如果都是英文,好说多了.但恰恰不是如此,中文是我们不得不用的.所以,哪怕是初学者,都要了解并能够解决字符编码问题. >>> name = '老齐' >>> name '\xe8\x80\x81\xe9\xbd\x90' 在你的编程中,你遇到过上面的情形吗?认识最下面一行打印出来的东西吗?看人家英文,就好多了 >>> name = "qiwsir" >>&g

  • python读写二进制文件的方法

    本文实例讲述了python读写二进制文件的方法.分享给大家供大家参考.具体如下: 初学python,现在要读一个二进制文件,查找doc只发现 file提供了一个read和write函数,而且读写的都是字符串,如果只是读写char等一个字节的还行,要想读写如int,double等多字节数 据就不方便了.在网上查到一篇贴子,使用struct模块里面的pack和unpack函数进行读写.下面就自己写代码验证一下. >>> from struct import * >>> fi

随机推荐