• 编码体系与规范


    编码体系与规范

    网页编码是指网页中字符的编码方式。目前国内常见的网页字符编码主要有utf-8、gbk、gb2312,其中 utf-8为国际化编码,在各国各地区的网站中都很常见,可以说是最通用的字符编码。此外,有些日本网页会使用EUC-JP、SHIFT-JIS,有些韩国网页会使用EUC-KR等字符编码。

    1 ASCII

    ASCII(American Standard Code for Information Interchange,美国信息互换标准代码)是美国在20世纪60年代制定的一套字符编码标准,主要用于显示美式英语、标准ASCII码使用7位二进制编码表示美式英语中会使用到的控制字符(例如退格、空格)以及可打印字符(例如数字0~9、大小写英文字母、标点符号、运算符号、美元符号),编码范围为0~127(二进制 00000000~01111111)。
    ASCII共表示128个字符,每个字符占一个字节,其中控制字符共33个。例如控制字符退格“backspace”为8(二进制00001000),可打印字符大写字母“A”为65(二进制01000001)。

    2 gb2312/gbk

    由于ASCII编码无法表示中文字符,中国在ASCII编码的基础上进行扩展,形成了中文字符编码,主要有gb2312、gbk以及gb18030。

    2.1 gb2312

    gb2312编码(《信息交换用汉字编码字符集》)是对ASCII的中文扩展,编码低于127的字符与ASCII编码相同。gb2312 使用两个字节连在一起表示一个汉字,两个字节中前一个称为高字节(范围0xA1~0xF7),后一个称为低字节(范围0xA1~0xFE)。其编码范围是0xA1A1~0xF7FE。

    gb2312共收录6763个汉字,每个汉字占两个字节。同时,gb2312对ASCII中的可打印字符重新编了两个字节长的编码,也就是人们常说的“全角”字符;编码低于127的可打印字符为“半角”字符。

    2.2 gbk

    gbk编码是gb2312的扩展,gbk兼容gb2312的所有内容并且又增加了近2000个新的汉字(包括繁体字)和符号ehk 同样使用两个字节表示一个汉字,只要第一个字节大于127,便认为是一个汉字的开始。其编码范围是0x8140~0xFEFE。

    3 unicode

    unicode(Universal Multiple-Octet Coded Character Set,通用多八位编码字符集)包含了世界上所有的文字和字符、在unicode字符集中每个字符都有唯一的特定数值。例如大写字母“A”在unicode中的码位为U+0041,汉字“乐”的码位为U+4E50。unicode通常使用两个字节来编码,称为UCS-2(Universal Character Set coded in 2 octets)。为了使unicode 能表示更多的文字,人们提出了UCS-4,使用4个字节编码。

    目前unicode 编码范围为0~0x10FFFF,最大的字符至少需要3个字节来表示。表示字符需要的字节数不相同,若直接在网页中使用会出现混淆问题;如果规定所有的字符都使用最大字节表示,会造成极大的空间浪费。为了解决编码字符集unicode 在网页中使用的效率问题,人们提出了utf-8、utf-16等编码方式。

    4 utf-8

    utf-8(8-bit Unicode Transformation Format)是一种针对 unicode字符集的可变长度字符编码方式。utf-8对不同范围的字符使用不同长度的编码,规则如下。

    1. unicode 码点在0x00~0x7F的字符,utf-8编码与ASCII编码完全相同。
    2. unicode 码点大于0x7F的字符,设需要使用n个字节来表示(n>1),第一个字节的前n位都设为1,第n+1位设为0,剩余的n-1个字节的前两位都设为10,剩下的二进制位使用这个字符的unicode码点来填充。

    5 编码转换

    Python 3中的字符串默认的编码为unicode,因此,gbk、gb2312等字符编码与utf-8编码之间都必须通过unicode编码才能互相转换。即在python中,使用encode()将unicode编码为utf-8、gbk等,而使用decode()将utf-8、gbk等字符编码解码为unicode

    image-20221102104616123

    image-20221102111504960

    6 查看数据编码格式

    6.1 查看网页编码

    我们在查看网页编码的编码格式可以使用requests库中的apparent_encoding查看网页的编码方式。

    import requests
    resp=requests.get('https://www.baidu.com/')
    resp.apparent_encoding
    
    • 1
    • 2
    • 3

    image-20221102105518274

    6.2 查看字符串编码

    这里我们使用chardet模块。

    chardet模块
    The easiest way to use the Universal Encoding Detector library is with the detect function.
    使用通用编码检测器库的最简单方法是使用detect函数
    The detect function takes one argument, a non-Unicode string. It returns a dictionary containing the auto-detected character encoding and a confidence level from 0 to 1.
    detect函数有一个参数, 即非 unicode 字符串。它返回一个字典, 其中包含自动检测的字符编码和从0到1的置信度。

    import chardet
    print(chardet.detect(str.encode('abc123')))
    print(chardet.detect(str.encode('张三')))
    print(chardet.detect(str.encode('\xe5\xa4\xa7')))
    
    • 1
    • 2
    • 3
    • 4

    输出结果为:

    image-20221102110948986

    注意:chardet.detect 在查看字符串传的编码时,必须要把字符串encode后,才能查看当前字符串编码格式

  • 相关阅读:
    【被抛弃的程序员】和30岁“转行程序员”Say GoodBye
    Android studio连接MySQL并完成简单的登录注册功能
    el-tree中插入图标并且带提示信息
    【愚公系列】2022年10月 微信小程序-优购电商项目-⾃定义组件传参
    基于JAVA物业后台管理系统计算机毕业设计源码+系统+mysql数据库+lw文档+部署
    导出excel换行问题,一个单元格多张图片问题,数组对象去重处理,计算属性传参
    微信小程序实验案例:简易成语小词典
    智慧法院解决方案-最新全套文件
    web期末网站设计大作业 奶茶店网站美食餐饮网站设计与实现(HTML+CSS+JavaScript)
    day04-JavaScript01
  • 原文地址:https://blog.csdn.net/W_chuanqi/article/details/127648388