基本存储单元

  • 位(bit, b):二进制数中的一个数位,可以是0或者1,是计算机中数据的最小单位。
  • 字节(Byte,B):计算机中数据的基本单位,每8位组成一个字节。
  • 1B = 8b
  • 各种信息在计算机中存储、处理,至少需要一个字节的空间。

字节与字符

  • 计算机存储的一切数据都是由一串 0 和 1 组成的字节序列构成。
  • 字符就是一个符号,比如一个汉字、一个英文字母、一个标点都可以称为一个字符。

编码与解码

  • 我们用编辑器打开的文本,看到的一个个字符,最终保存在磁盘上的时候都是以二进制字节序列形式存起来的。那么从字符到字节的转换过程就叫做编码(encode),反过来叫做解码(decode),两者是一个可逆的过程。编码是为了存储传输,解码是为了方便显示阅读。

编码规则

  • 编码是人们定义的一种规则,使字符可以根据该规则,转换为对应的字节,方便存储和传输,也可以使字节转化成对应的字符用于显示、阅读。
  • 例如,按照 ASCII 编码进行转换,字符 A 对应的字节为 0100 0001,占用 1 个字节的大小,一个字节也就是8位,可以表示 0 - 255,对于英文来讲 255 个字符已经足够显示所有的英文字符了,所以 ASCII(每个 字符占用一个字节) 编码是美国的标准编码
  • 但是 ASCII 处理中文明显是不够的,中文不止 255 个汉字,所以中国制定了 GB2312 编码,用两个字节表示一个汉字。GB2312 还把 ASCII 包含进去了,同理,日文,韩文等等上百个国家为了解决这个问题就都发展了一套字节的编码,标准就越来越多,如果出现多种语言混合显示就一定会出现乱码
  • 于是 unicode 出现了,将所有语言统一到一套编码里,每一个 unicode 字符占用两个字节的大小空间
  • 乱码问题解决了,但是如果内容全是英文,unicode 编码比 ASCII 需要多一倍的存储空间,同时如果进行网络传输也需要传输多一倍的数据
  • 所以出现了可变长的编码 "utf-8",把英文变长一个字节,汉字 3 个字节。特别生僻的变成4-6字节,如果传输大量的英文,utf-8作用就很明显了。

encode() 和 decode()

  • decode 英文意思为 解码,encode 英文意思为 编码
  • decode 的作用是将其他编码转换成 unicode编码,例如 str1.decode('gbk'),表示将 gbk 编码的字符串 str1 转换成 unicode 编码
  • encode 的作用是将 unicode 编码的字符串,转换成其他编码的字符串,例如str2.encode('gbk'),表示将 unicode 编码的字符串st2,转换为 gbk 编码
  • 在 Python2 中,windows 简体中文平台下,字符串表示是 GBK 编码,在 Linux 平台下表示为 UTF8编码,可以在字符串定义时,修改字符编码格式,定义为 unicode 编码,例如 a = u'你好'
  • 在 Python3中,所有系统平台下字符串都表示为 unicode 编码,
  • 因此在编码转换时,通常需要以 unicode 作为中间编码,先将其他编码的字符串解码(decode)成 unicode,再从 unicode 编码(encode)成另一种指定编码。

UnicodeDecodeError 和 UnicodeEncodeError

环境:windows简体中文 + Python2.7,当前环境 str 默认显示编码为 gbk(Linux 环境中 Python2.7 默认显示编码为 utf8)

>>> a = '你'
>>> a
'\xc4\xe3'
# 对应 gbk 编码
>>> a.encode()
UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 0: ordinal not in range(128)
# 当 a.encode() 执行时,python 解释器发现 a 的编码格式为 GBK ,但是只有 unicode 编码才能进行 encode,所以系统帮我们执行了 a.decode().encode()
# 在 python2 中系统默认的 encoding 编码为 ascii,所以相当于 a.decode('ascii').encode('ascii')
# 查看系统默认 encoding 编码
>>> import sys
>>> sys.getdefaultencoding()
'ascii'
# 因 ascii 编码中不支持中文字符,所以在执行到 decode时就出现了报错 UnicodeDecodeError
# 可以将 a 解码为 unicode,再编码为 utf8格式
>>> a.decode('gbk')
u'\u4f60'
>>> a.decode('gbk').encode('utf8')
'\xe4\xbd\xa0' #在 pyhton2 中定义 unicode 编码的字符串
>>> b
u'\u6211'
>>> b.encode()
UnicodeEncodeError: 'ascii' codec can't encode character u'\u6211' in position 0: ordinal not in range(128)
# 在 python2 中系统默认的 encoding 编码为 ascii,所以相当于执行了 a.encode('ascii')
# ascii 编码中不支持中文字符,所以出现了UnicodeEncodeError # 可以把字符串b编码为 uft8 或者 gbk 格式,因为这两种编码都支持中文字符
>>> b.encode('utf8')
'\xe6\x88\x91'
>>> b.encode('gbk')
'\xce\xd2'

Python3 编码

在 Python3 中字符串统一使用 unicode编码,并且系统默认 encoding 为 utf8

  • unicode 对内存操作友好,因为每一个字符占用的空间一样
  • utf-8对存储和传输友好,因为会对应的减少占用空间的大小
>>> import sys
>>> print(sys.getdefaultencoding())
utf-8 >>> a = "你好"
>>> a.encode()
b'\xe4\xbd\xa0\xe5\xa5\xbd' >>> a.encode().decode()
'你好'
>>> a.encode('gbk').decode('gbk')
'你好'

Python2 和 Python3 编码问题的更多相关文章

  1. python2和python3编码问题

    欢迎加入python学习交流群 667279387 一.什么是编解码 1.什么是unicode 2.编码方式 二.python中的编解码 1.python2 (1).encode() 和 .decod ...

  2. 字符编码、python2和python3编码的区别

    目录 字符编码 文本编辑器存储信息的过程 python解释器解释python代码的流程 python解释器与文本编辑器的异同 不同编码格式存入与读取数据的过程 乱码的分析 python2和python ...

  3. python2和python3编码

    python2编码 unicode:unicode 你好 u'\u4f60\u597d' | | | | encode('utf8')| |decode('utf8') encode('gbk')| ...

  4. python2与python3编码

    #coding:utf8#一#1.在python2中,默认以ASCII编码chcp 936import sysprint sys.getdefaultencoding()# ascii#str:byt ...

  5. Python2和Python3编码的区别

    Python2 python2中有两种储存变量的形式,第一种:Unicode:第二种:按照coding头来的. 假设python2用utf8存储x='中文',当你print(x)的时候,终端接收gbk ...

  6. python2与python3编码问题

    python2: UnicodeDecodeError: 'ascii' codec can't decode byte 0xc4 in position 33: 解决办法: 在报错的页面添加代码:  ...

  7. python2与python3编码(练习)

    #_author:来童星#date:2019/12/9import jsons='star'a=s.encode('utf8')print(s,type(s))# star <class 'st ...

  8. pickle 在python2 to python3 编码出现错误

    pickle.load(file) UnicodeDecodeError: 'ascii' codec can't decode byte 0xf5 in position 2: ordinal no ...

  9. Python全栈之路----Python2与Python3

    金角大王Alex  python 之路,致那些年,我们依然没搞明白的编码 python2与python3的区别 py2 str = bytes 为什么有bytes? 是因为要表示图片.视频等二进制格式 ...

随机推荐

  1. Spring Boot Ftp Client 客户端示例支持断点续传

    本章介绍 Spring Boot 整合 Ftpclient 的示例,支持断点续传 本项目源码下载 1 新建 Spring Boot Maven 示例工程项目 注意:是用来 IDEA 开发工具 File ...

  2. 使用Dotfunsctor

    设置Disable Control Flow.Disable Renaming.Disable String Encryption 为no,no为开启该功能 设置加密后输出的路i经 选择需要加密的ex ...

  3. Java语言特性、加载与执行

    [开源.免费.纯面向对象.跨平台] 简单性: 相对而言,例如,Java是不支持多继承的,C++是支持多继承的,多继承比较复杂:C++ 有指针,Java屏蔽了指针的概念.所以相对来说Java是简单的. ...

  4. Codeforces Round #608 (Div. 2) - D. Portals(贪心)

    题意:你起初有一支军队,有$k$个士兵,现在有$n$座城堡,你若想占领第$i$座城堡,至少得有$a[i]$个士兵才能占领$($占领后士兵不会减少$)$,占领了第$i$座城堡后,你将得到$b[i]$个士 ...

  5. 【PAT甲级】1052 Linked List Sorting (25 分)

    题意: 输入一个正整数N(<=100000),和一个链表的头结点地址.接着输入N行,每行包括一个结点的地址,结点存放的值(-1e5~1e5),指向下一个结点的地址.地址由五位包含前导零的正整数组 ...

  6. 【PAT甲级】1050 String Subtraction (20 分)

    题意: 输入两个串,长度小于10000,输出第一个串去掉第二个串含有的字符的余串. trick: ascii码为0的是NULL,减去'0','a','A',均会导致可能减成负数. AAAAAccept ...

  7. php海量架构

    架构 Varnish+nginx+php(FastCGI)+MYSQL5+MenCache+MenCachedb 说明:我在设计系统架构时,进行了大胆的尝试,只用6台Web服务器,达到了可承受4000 ...

  8. python2.7 一个莫名其妙的错误

    先看看错误: Traceback (most recent call last): File "/home/darkchii/文档/PycharmProjects/ml/model.py&q ...

  9. 第二节: Vuejs常用特性1

    一. 常用特性 1. 表单元素 通过 v-model指令绑定 输入框.单选/多选框.下拉框.文本框 2. 表单域修饰符 (1) .number:转换成数值,如果输入的是非数字字符串时,无法进行转换 ( ...

  10. 【网摘】监控 div 的内容变化

    数据是动态加载而来,而当无数据时,提示一下暂无数据.而数据是可以动态在当前页面即时添加的,故在无数据时所做提示,需要隐藏,所以找了这个方法.成功在动态添加数据后,暂无数据的提示没有了. if($(&q ...