编码体系与规范

编码体系与规范

网页编码是指网页中字符的编码方式。目前国内常见的网页字符编码主要有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

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')))

输出结果为:

image-20221102110948986

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

W_chuanqi

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值