关于编码的理解

一、字节

关于编码的理解始于字节这一数据格式。整型转字节类型使用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'\x01\x00\x00\x00'))  ==>  (1, 0)
转义为long型整数: struct.unpack('<L', bytes(b'\x01\x00\x00\x00'))  ==>  (1,)
#------------------
#整数转字节串:
转为两个字节: struct.pack('<HH', 1,2)  ==>  b'\x01\x00\x02\x00'
转为四个字节: struct.pack('<LL', 1,2)  ==>  b'\x01\x00\x00\x00\x02\x00\x00\x00'

二、 编码

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个汉字。




猜你喜欢

转载自blog.csdn.net/u010359398/article/details/80930231
今日推荐