Python关于编码的一些总结

Python关于编码的一些总结

(关于学习廖雪峰Python教程的一些个人总结)

首先你一定听过Unicode,UTF-8,ASCII编码。

在编码使用的字节长度上:

ASCII:美国人发明,最早只有127个字符(包括大小写英文,数字,符号)被编码到计算机里,只用一个字节表示

Unicode:但是每个国家都有自己的语言,一个字节肯定不够,就得需要两个或者更多字节表示,每个国家都制定了自己的编码标准,比如中国的GB2312编码,但是这样容易冲突导致乱码。所以Unicode标准产生,统一所有语言,通常用两个字节表示一个字符(生僻字可能用到四个字节),这样像ASSCII这样只需一个字节编码的符号,只需在前面补零。比如’A’的ASCII二进制是01000001,Unicode就是00000000 01000001。

UTF-8:但是在传输和存储上,如果含有大量ASCII里面的字符,使用Unicode编码就会导致传输效率低下,浪费存储空间,本着节约的原则,就有了可变长编码UTF-8编码。UTF-8编码把一个Unicode字符根据不同的数字大小编码成1-6个字节,常用的英文字母被编码成1个字节,汉字通常是3个字节,只有很生僻的字符才会被编码成4-6个字节

下面表格表示了同一个字符不同编码的区别(二进制表示):

字符ASCIIUnicodeUTF-8
A0100000100000000 0100000101000001
x01001110 0010110111100100 10111000 10101101

可以发现,UTF-8编码有一个额外的好处,就是ASCII编码实际上可以被看成是UTF-8编码的一部分。

在计算机系统中编码工作方式上:

在计算机内存中,统一使用Unicode编码,当需要保存到硬盘或者需要传输的时候,就转换为UTF-8编码

比如有两个例子:

1、用记事本编辑的时候,从文件读取的UTF-8字符被转换为Unicode字符到内存里,编辑完成后,保存的时候再把Unicode转换为UTF-8保存到文件:

rw-file-utf-8

2、浏览网页的时候,服务器会把动态生成的Unicode内容转换为UTF-8再传输到浏览器:

web-utf-8

关于编码和解码

通俗来讲,编码就是把字符串或数据编码成人看不懂的东西(以字节为单位的bytes),但是对计算机来说很爽,比如存储和传输很方便,解码就是把编码后的字符串再解码回人能看懂的字符串。

Python3的字符串类型是str,内存中以Unicode编码,

你可能见过下面这些东西

b'\xe4\xb8\xad\xe6\x96\x87'
b'\u4e2d\u6587'

第一行\x开头的一串就是’中文’这个字符串用UTF-8编码后的形式(bytes对象),第二行\u开头的是’中文’这个字符串的Unicode编码形式,所以编码encode就是把人看懂的字符串编码成人看不懂但是计算机能看懂的东西。

解码就是把bytes解码成人能看懂的

b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')
b'\u4e2d\u6587'.decode('unicode_escape')
## '中文'

关于字符串前面的字母

你可能见过下面这些东西

b'\xe4\xb8\xad\xe6\x96\x87'
u'中文'
r'\n\n\n\n'

第一行b'\xe4\xb8\xad\xe6\x96\x87'上面我们见到了,它表示这是一个bytes对象,也就是编码后的结果,而不是str,不是str,不是str,不是字符串,它具有decode方法,可以解码成字符串,也就是可以这样写:

b'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')

但是你这样写就不行

'\xe4\xb8\xad\xe6\x96\x87'.decode('utf-8')

因为这样写表示这是个字符串,解释器会报错告诉你str类型没有decode方法。

第二行u'中文'表示字符串以Unicode格式进行编码,一般用在中文字符串前面。

第三行r'\n\n\n\n'表示去转义,即r后面跟着的字符串中有啥打印啥,不会出现转义字符

print(r'\n\n\n\n')

结果会是’\n\n\n\n’,而不是四个换行符。

关于Python文件(.py文件)开头的注释

你可能见到过别人的项目Python文件开头有这样的注释

#!/usr/bin/env python3
# -*- coding: utf-8 -*-

第一行注释是为了告诉Linux/OS X系统这是一个Python可执行程序Windows系统会忽略这个注释

第二行注释是为了告诉Python解释器,按照UTF-8编码读取源代码,否则,你在源代码中写的中文输出可能会有乱码。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值