一、字节
关于编码的理解始于字节这一数据格式。整型转字节类型使用bytes()函数,其他进制转2进制使用bin()函数。
1. 定义
字节是一系列单字节的组合,每一个字节都是[0, 255](无符号)范围内组成。
单字节:一个字节8个数据位
2. 转换
(1) 字符串和字节串的相互转化
参考自:https://blog.csdn.net/baidu_19473529/article/details/80042582
#bytes object
byte = b"byte example"
# str object
str = "str example"
# str to bytes 字符串转字节
bytes(str, encoding="utf8")
# bytes to str 字节转字符串
str(bytes, encoding="utf-8")
# an alternative method
# str to bytes 字符串转为字节
str.encode(str)
# bytes to str 字节转为字符串
bytes.decode(bytes)
(2) 单字节(单字符串)和二进制(ASCII码)的转换 ---ord() / chr()
# 用户输入字符
c = input("请输入一个字符: ")
# 用户输入ASCII码,并将输入的数字转为整型
a = int(input("请输入一个ASCII码: "))
print( c + " 的ASCII 码为", ord(c))
print( a , " 对应的字符为", chr(a))
运行结果:
请输入一个字符: a
请输入一个ASCII码: 101
a 的ASCII 码为 97
101 对应的字符为 e
(3) 单字节(单字符串)和十进制的转换
#字节串转整数:
转义为short型整数: struct.unpack('<hh', bytes(b'x01x00x00x00')) ==> (1, 0)
转义为long型整数: struct.unpack('<L', bytes(b'x01x00x00x00')) ==> (1,)
#------------------
#整数转字节串:
转为两个字节: struct.pack('<HH', 1,2) ==> b'x01x00x02x00'
转为四个字节: struct.pack('<LL', 1,2) ==> b'x01x00x00x00x02x00x00x00'
二、 编码
1. ASCII码
是美国标准信息交换代码(American Standard Code for Information Interchange)的缩写, 为美国英语通信所设计。它由128个字符组成,包括大小写字母、数字0-9、标点符号、非打印字符(换行符、制表符等4个)以及控制字符(退格、响铃等)组成。
ASCII 码的数字范围: 48 --- 57
大写字母范围: 65 --- 90
小写字母范围: 97 --- 122
2. Unicode
Unicode(统一码、万国码、单一码)是计算机科学领域里的一项业界标准,包括字符集、编码方案等。Unicode 是为了解决传统的字符编码方案的局限而产生的,它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
3. UTF压缩过的(Unicode)
UTF-8是一种可变宽度 字符编码,能够使用一到四个8位字节对Unicode中的所有1,112,064 [1]个有效代码点进行编码。
优势
UTF-8最大的优势是,没有字节序的概念。所以特别适合用于字符串的网络数据传输,不用考虑大小端问题。对于非英文网页(对于我们而言,简单说东亚文字网页),能够避免各种乱码问题。
劣势
本地字符串处理过程中,如果使用UTF-8,对于英文字符的处理没有太大的问题。一个char变量表示一个英文字符。但是对于中文等远东字符集来说,就比较坑爹了。char str[]; str[0]并不能完整表示一个汉字。UTF-8编码格式下,一个汉字需要至少3个char才能表示。这对于通过下标来操作字符串的操作来说是非常痛苦的一件事情。
4. GBK
GBK编码,是在GB2312-80标准基础上的内码扩展规范,使用了双字节编码方案,其编码范围从8140至FEFE(剔除xx7F),共23940个码位,共收录了21003个汉字。