因为我自己整理在笔记本上好几次,但是今天看到的时候,又凌乱了。所以还是再次重新整理到博客上。

在计算机的世界里:

1 bytes(字节) == 8 bite(比特);每个bite里存放0或1。

于是一个字节能表示的最大数是:11111111(2) == 255(10);能表示的最小数是:00000000(2) == 0(10)

那么1个字节的范围是:[0, 2^8-1];

同理2个字节的范围是:[0, 2^16-1];以此类推···

电脑(是美国人发明的)最早使用的是ASCII编码准则,里面包含了127个字符,能够对应表示所有的大小写英文字母、数字、特殊符号。因为127<255,所以一个字节对于英文字符的处理是足够的。

但是汉字有几万个,一个字节是完全不够的。至少需要两个字节(2^16-1),并且不与原来的ASCII编码冲突。所以中国制定了GB2312。

中国对应的GB2312;韩国对应的Euc-kr;日本对应的Shift-JIS等等。各国不统一的标准后,就会造成冲突:乱码。

于是统一的标准出现了:Unicode:把所有语言都统一到一套编码里。

Unicode的标准是:通常2个字节表示一个字符,非常生僻字符用4个字节表示。

Unicode解决了乱码冲突问题,同时带来了效率和内存问题:因为Unicode用2个字节表示一个字符,ASCII用1个字节表示。效率和存储上都是一倍的差距。

于是UTF-8编码诞生了:英文字符用1个字节、中文字符用3个字节、生僻字符4至6个字节。如果文本中包含大量英文字符,UTF-8就更节省空间,传输效率也更快。

(ASCII编码属于UTF-8的一部分,所以只支持ASCII编码的历史遗留软件可以在UTF-8编码下继续使用)

字符 ASCII Unicode UTF-8
A 01000001 00000000 01000001 01000001
x 01001110 00101101 11100100 10111000 10101101

python里有2种字符串:

字节码串:没有数据描述的数据

字符串:原始数据+数据描述(指出何种字符集)

python2里:

1.str:字节码串

2.unicode:字符串(定义时需要u''去声明)

因此在python2里,日常字符串的表示为:u'xxx',当前编码设定下的字节码串的表示为:'xxx'。非常不方便,本末倒置。于是在python3里对其修改。

python3里:

1.bytes:字节码串

2.str:字符串(默认支持Unicode字符集,所以不需要u''去定义字符串)

所以在python3里,日常字符串的表示为:'xxx',字节码串的表示为:b'xxx'。

所以现在一般认为python里有两种字符串:

1.存储文本的str:Unicode存储;len(str)是计算字符数

2.存储字节的bytes:原始字节序列ASCII存储;len(bytes)是计算字节数

bytes --decode--> unicode --encode--> bytes

encode()方法:

>>> 'abc'.encode('ascii')  # 按照ascii编码将unicode字符串转换成bytes字节码串
b'abc'
>>> '中文'.encode('utf-8')  # 照ascii编码将unicode字符串转换成bytes字节码串
b'\xe4\xb8\xad\xe6\x96\x87'
>>> '中文'.encode('ascii')  # 因为ascii编码里没有中文字符,所以报错
Traceback (most recent call last):File "<pyshell#11>", line 1, in <module>'中文'.encode('ascii')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)

decode()方法:

>>> b'abc'.decode('ascii')  # 按照ascii编码将bytes字节码串解码为str字符串
'abc'
>>> b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')  # 按照utf-8编码将bytes字节码串解码为str字符串
'中文'
>>> b'\xe4\xb8\xad\xff'.decode('utf-8')
Traceback (most recent call last):File "<pyshell#15>", line 1, in <module>b'\xe4\xb8\xad\xff'.decode('utf-8')
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xff in position 3: invalid start byte
>>> b'\xe4\xb8\xad\xff'.decode('utf-8', errors='ignore')  # 设置错误处理方案为‘ignore’便可忽略\xff的错误
'中'

写完我自己清楚多啦~

转载于:https://www.cnblogs.com/hongdanni/p/10484874.html

python里我最容易搞不清楚问题之一的encode和decode相关推荐

  1. 一节课让你彻底搞懂python里面试最常问问题之一深浅复制

    首先,我们得了解的是深浅复制究竟是个什么玩意&这玩意到底是干啥的! 打个比方:有糖纸和糖,深复制就相当于糖纸和糖都有,而浅复制就只有糖纸.(这句话牢记于心,在你看完本文后再来反复揣摩本句,如果 ...

  2. python nlp包_StanfordNLP,让你在 Python 里一手掌握 53 种自然语言分析

    发表日期:2019-06-12 StanfordNLP,让你在 Python 里一手掌握 53 种自然语言分析 -- 不久之前,斯坦福大学公开了它最新的自然语言处理代码库-- StanfordNLP. ...

  3. python新年有趣代码_搞几款由“Python”语言编写的“有趣、恶搞、好玩”的程序代码!...

    下载好向圈APP可以快速联系圈友 您需要 登录 才可以下载或查看,没有帐号?立即注册 x 为提高大家对"Python"编程语言的学习兴趣,今天给大家分享几款有趣的Python程序代 ...

  4. 一篇长文带你在python里玩转Json数据

    Json简介 Json(JavaScript Object Notation) 很多网站都会用到Json格式来进行数据的传输和交换. 这因为Json是一种轻量级的数据交换格式,具有数据格式简单,读写方 ...

  5. 下列哪个不是目前python里的内置模块-python中那些小众但有用的内置模块

    今天带来的是python里一些小众但是却比较实用的python库,一起来看看吧! pprint:更清晰的打印 pprint 是 pretty printer 的缩写,用来打印 Python 数据结构, ...

  6. python大神-Python 大神 kennethreitz 又搞事了

    原标题:Python 大神 kennethreitz 又搞事了 Python 程序员,特别是做爬虫的同学都知道 HTTP 请求库 Requests,Requests 完美体现了 "for H ...

  7. python中的format什么意思中文-python里format什么意思

    format是python2.6新增的一个格式化字符串的方法,相对于老版的%格式方法,它有很多优点. 1.不需要理会数据类型的问题,在%方法中%s只能替代字符串类型(推荐学习:Python视频教程) ...

  8. python能绘制统计图吗-特征锦囊:常用的统计图在Python里怎么画?

    今日锦囊 常用的统计图在Python里怎么画? 这里的话我们介绍几种很简单但也很实用的统计图绘制方法,分别有条形图.饼图.箱体图.直方图以及散点图,关于这几种图形的含义这边就不多做解释了. 今天用到两 ...

  9. python装饰器类-PYTHON里的装饰器能装饰类吗

    扩展回答 如何理解python里的装饰器 通常可以理解它是一个hook 的回调函数. 或者是理解成python 留给二次开发的一个内置API. 一般是用回调和hook 方式实现的. 如何理解Pytho ...

最新文章

  1. 推荐系统(1)--splitting approaches for context-aware recommendation
  2. 三种SQL分页查询的存储过程
  3. Winform无法加载基类的错误解决
  4. recycleview 嵌套高度问题_RecyclerView嵌套子RecyclerView无法正常显
  5. Java判断字符串既不等于A也不等于B
  6. 利用 Python / R 对数据集进行「长」「宽」转换
  7. python excel导入oracle数据库_【Python代替Excel】12:Python操作oracle数据库
  8. 中秋节PSD分层模板|电商营销借势促销,快快收藏!
  9. 出现画面抖动_无人机航拍延时画面抖动怎么办?PR中的这个增稳功能帮你解决...
  10. vim 编辑器 bash文件测试
  11. 多态与虚函数(C++)
  12. 拿R来画画(八):面积图与堆积图
  13. Keras入门级MNIST手写数字识别超级详细教程
  14. FastAPI获年度第一新兴框架,2021年最受欢迎的TOP 100开发工具出炉
  15. 这个时代,“寒门再难处贵子”【转载】
  16. java微信开发平台_Java微信公众平台开发(1) 接入微信公众平台
  17. 测绘人真实故事 | 放弃上万月薪从私企跳回国企
  18. HiveHive的两种访问方式
  19. Empire信息收集
  20. CorelDRAW版本限制使用关闭永久禁止联网登录弹窗口错误修复教程

热门文章

  1. 语言中根号打法_知识的诅咒,数学老师在教学中不得不防的陷阱
  2. git创建版本库(1)
  3. linux系统给串口权限,让ubuntu串口和USB设备不用root权限访问
  4. Python入门--为什么将元组设计为不可变序列
  5. Assignment 双向队列
  6. 两波形相位差的计算值_波形相位频率可调DDS信号发生器(设计分享)
  7. 蛮力法 —— 求解最大连续子序列和问题
  8. OpenGL基础24:聚光灯
  9. 2018 Multi-University Training Contest 3: G. Interstellar Travel(凸包)
  10. HDU 5975 2016ICPC大连 E: Aninteresting game(树状数组原理)