• 功能基础篇1——壹文搞清编码、解码、字符集、编码方式、字符编码、编码方式


    编解码

    编码是信息从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)。

    示例

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

    Python3源文件默认使用Unicode字符集和UTF-8编码,内存中字符串同理

    import sys
    print(sys.getdefaultencoding())  # utf-8,获取Unicode字符集当前默认使用的编码方式
    
    • 1
    • 2

    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='
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    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
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    视频与视频编码

    视频编码,是指在减少视频数据体积大小或码率的同时而不会或尽可能不对其质量产生不良影响(在人类的视觉感知下)

    视频解码,视频编码的逆过程

    视频转码:将视频从一种编码格式转换为另一种编码格式

    加解密

    加解密是一种特殊的编码,两者都是对信息的转换,不同点在于编解码是公开的,而加解密通常只有持有密钥的人操作。

  • 相关阅读:
    史上最全 结构型模式之 桥接 外观 组合 享元模式
    手搓自动微分
    Flask之路由(app.route)详解
    机器学习笔记:t-SNE
    【计算机网络】网络编程接口 Socket API 解读(3)
    基于springboot小区物业管理系统
    HBase之Compaction
    网络安全(黑客)自学
    C++ —— 继承
    【计算理论】复杂性类coNP
  • 原文地址:https://blog.csdn.net/UZDW_/article/details/133002707