编解码
编码是信息从A形式转换为B形式的过程,解码是信息从B形式转换为A形式的过程。A形式的信息通常是直观的,而B形式的信息往往是为实现某种目的而造就的。
- 统一格式,方便表示和处理
- 压缩体积,方便存储和传输
- 加密信息,方便认证和保密
字符集与字符编码
字符集
字符集,Character Set,是若干字符的集合,字符包括可显示字符以及控制字符,可显示字符如阿拉伯数字、标点符号、拉丁字母、汉字等,控制字符如空字符、换行符、制表符等。
不同字符集有不同的标准,包含的字符数量和种类不一样。
字符编码
字符在计算机中以字体文件形式存储,楷体、黑体等字体是字符图形描述,在屏幕上显示时需要字体信息,而在其他情况下,无需详细的字体信息,只需要一个二进制数字表示即可代表该字符,在屏幕上展示时通过该二进制数字找到对应字体信息即可,该二进制数字称为码点(code point)或码位(code position),不同字符集以不同方式编码字符为码点,某种字符集中字符组成的字符串以某种方式编码,必须以该方式解码,否则会显示异常,称之为乱码。
注:在讨论字符集和编码方式时,一些字符集标准并未专门为其编码方式命名,或者说字符集与编码方式名称一致。
ASCII
https://zh.wikipedia.org/zh-cn/ASCII
American Standard Code for Information Interchange,美国信息交换标准代码,ASCII中一共128个字符。
GB
国家标准与相关技术规范指导。
GB2312
https://std.samr.gov.cn/gb/search/gbDetailed?id=71F772D79E19D3A7E05397BE0A0AB82A
https://openstd.samr.gov.cn/bzgk/gb/newGbInfo?hcno=A1931A578FE14957104988029B0833D3
信息交换用汉字编码字符集·基本集,GB2312,国家标准。
GBK
汉字内码扩展规范,GBK(国标扩)是对GB2312的扩展,兼容GB2312,技术规范指导性文件。
GB18030
信息技术·中文编码字符集,兼容GB2312和GBK,国家标准。
Unicode
Unicode,统一码、万国码,包含世界上大部分符号,Unicode字符集有不同编码方式,如UTF-8(8-bit Unicode Transformation Format)。
https://www.jianshu.com/p/da94aab377b4
https://www.unicode.org/versions/Unicode16.0.0/
https://www.unicode.org/Public/UCD/latest/charts/CodeCharts.pdf
示例
with open("string.txt", "w+", encoding="UTF-8") as f:
f.write("编解码")
with open("string.txt", "r", encoding="UTF-8") as f:
print(f.readline()) # 编解码
with open("string.txt", "r", encoding="GBK") as f:
print(f.readline()) # UnicodeDecodeError: 'gbk' codec can't decode byte 0xac in position 4: illegal multibyte sequence
Python3源文件默认使用Unicode字符集和UTF-8编码,内存中字符串同理
import sys
print(sys.getdefaultencoding()) # utf-8,获取Unicode字符集当前默认使用的编码方式
Base64
Base64是一种基于64个可打印字符来表示二进制数据的编码方式。64个可打印字符包括ASCII字符集中的大小写字符各26个、10个数字、+、/,另外=作为填充符。
HTTP传输图片(二进制),Content-Type为image/gif,可以正常传输,若将二进制文件当作文本文件传输可以不关注二进制文件的Content-Type,但二进制文件直接转字符串会因为不同系统对某些字符识别为特殊字符并做特殊处理而导致失真,通常使用Base64对二进制文件进行编码,然后再进行网络传输。
import base64
string = b"""Man is distinguished, not only by his reason, but by this singular passion from other animals, which is a lust of the mind, that by a perseverance of delight in the continued and indefatigable generation of knowledge, exceeds the short vehemence of any carnal pleasure."""
print(base64.b64encode(string))
b'TWFuIGlzIGRpc3Rpbmd1aXNoZWQsIG5vdCBvbmx5IGJ5IGhpcyByZWFzb24sIGJ1dCBieSB0aGlzIHNpbmd1bGFyIHBhc3Npb24gZnJvbSBvdGhlciBhbmltYWxzLCB3aGljaCBpcyBhIGx1c3Qgb2YgdGhlIG1pbmQsIHRoYXQgYnkgYSBwZXJzZXZlcmFuY2Ugb2YgZGVsaWdodCBpbiB0aGUgY29udGludWVkIGFuZCBpbmRlZmF0aWdhYmxlIGdlbmVyYXRpb24gb2Yga25vd2xlZGdlLCBleGNlZWRzIHRoZSBzaG9ydCB2ZWhlbWVuY2Ugb2YgYW55IGNhcm5hbCBwbGVhc3VyZS4='
URL编解码
URL编码方便处理信息,例如请求AT&T公司信息,http://www.yuzao.com/company?name=AT&T&type=1。
期望参数解析是这样的
实际上不特殊处理参数会解析异常
from urllib import parse
string = parse.quote('AT&T')
print(f"https://www.yuzao.com/company?name={string}&type=1")
# https://www.yuzao.com/company?name=AT%26T&type=1
print(f"https://www.yuzao.com/company?name={parse.unquote(string)}&type=1")
# https://www.yuzao.com/company?name=AT&T&type=1
视频与视频编码
视频编码,是指在减少视频数据体积大小或码率的同时而不会或尽可能不对其质量产生不良影响(在人类的视觉感知下)
视频解码,视频编码的逆过程
视频转码:将视频从一种编码格式转换为另一种编码格式
加解密
加解密是一种特殊的编码,两者都是对信息的转换,不同点在于编解码是公开的,而加解密通常只有持有密钥的人操作。
标准库encodings
编码方式常量
from encodings import utf_8
print(utf_8.getregentry().name)
# utf-8