常用五种编码方式总结(ASCII,Unicode,UTF-8,GB123,Base64)

ASCII码

ASCII(American Standard Code for Information Interchange,美国信息交换标准代码)是一种常见的字符编码系统,定义了128个数字编码,包括字母、数字、标点符号和控制字符等。每个字符用一个7位的二进制数表示。
ASCII码表中的字符从0到127,其中0到31为控制字符(如回车、换行等),32到127为可显示字符(如大写字母、小写字母、数字和标点符号)。

可以通过以下方式将ASCII码转换为对应的字符:

  • 在编程语言中使用相应的函数或方法进行转换。
  • 在文本编辑器中输入特定的转义序列,如"\x41"表示字符’A’。

同样地,也可以将字符转换为对应的ASCII码:

  • 在编程语言中使用相应的函数或方法进行转换。
  • 在文本编辑器中查看字符的ASCII码值。

当我们要将字符转换为对应的ASCII码时,可以使用编程语言提供的函数或方法来实现。以下是使用Python语言中的ord()函数来获取字符的ASCII码的示例:

char = 'A'
ascii_code = ord(char)
print(ascii_code)

运行以上代码,输出结果为:

65

这里我们将字符’A’转换为其对应的ASCII码,即65。

反过来,如果要将ASCII码转换为对应的字符,可以使用chr()函数。以下是将ASCII码转换为字符的示例:

ascii_code = 65
char = chr(ascii_code)
print(char)

运行以上代码,输出结果为:

A

这里我们将ASCII码值为65的字符转换为对应的字符’A’。


Unicode

Unicode(统一码、万国码)是一种字符编码标准,它的目标是为世界上所有的字符提供唯一的标识和编码。Unicode定义了一个庞大的字符集,包括了绝大部分的语言中所使用的字符、符号、标点以及各种专用符号。

Unicode的编码范围非常广泛,目前已经定义了超过1.1万个平面(Plane),其中第0平面(Basic Multilingual Plane,BMP)是最常用的,包含了大部分常用字符。除了BMP之外,还有一些辅助平面(Supplementary Planes)用于存储较不常用的字符。

Unicode采用了一种独立于平台和语言的编码方案,每个字符都分配了一个唯一的编号,称为码点(Code Point)。Unicode的码点表示为十六进制形式,通常前面加上"U+"前缀,例如U+0041表示拉丁字母"A"的码点。

由于Unicode字符集非常庞大,不能直接用一个字节来表示所有的字符,因此引入了不同的编码方案来实现Unicode字符的存储和传输。常用的编码方案包括UTF-8、UTF-16和UTF-32。

  • UTF-8(Unicode Transformation Format-8)是一种变长编码方式,可用1至4个字节来表示一个Unicode字符。对于ASCII字符,UTF-8使用1个字节表示,与ASCII编码兼容,这样就保证了向后兼容性。
  • UTF-16(Unicode Transformation Format-16)是一种定长或变长的编码方式,最常见的是使用2个字节表示一个Unicode字符。对于BMP中的字符,UTF-16使用2个字节表示,而辅助平面中的字符则需要4个字节来表示。
  • UTF-32(Unicode Transformation Format-32)是一种定长编码方式,每个Unicode字符使用4个字节来表示,无论字符是否在BMP中。
  • Unicode(统一码、万国码)是当前最广泛使用的字符编码标准,它为世界上各种语言中的每个字符都分配了一个唯一的数字编号,包括字母、数字、符号、标点以及各种语言中的汉字、阿拉伯字母等。

以下是将字符串转换为Unicode编码,然后将Unicode编码转换回字符串的Python代码示例:

# 将字符串编码为Unicode编码
string = "hello, 你好"
unicode_str = string.encode('unicode_escape')
print(unicode_str)  # 输出 b'hello, \\u4f60\\u597d'

# 将Unicode编码解码为字符串
decode_str = unicode_str.decode('unicode_escape')
print(decode_str)  # 输出 hello, 你好

Unicode的优势在于它提供了一个统一、全球范围的字符标准,使得不同语言和文化之间的信息交流更加便捷。它为软件开发者和用户提供了更广泛的字符支持,使得跨语言、多语言的应用程序变得更加容易实现。


UTF-8

UTF-8(Unicode Transformation Format-8)是一种Unicode字符编码方案,它是目前最常用的字符编码方式之一。UTF-8使用可变长度的字节序列来表示Unicode字符,能够覆盖Unicode字符集的所有字符。

UTF-8的设计基于以下几个原则:

  1. 向后兼容:UTF-8能够完美兼容ASCII字符集,即保证ASCII字符与传统的ASCII编码一致,使用一个字节表示,这使得已有的ASCII文本无需转换即可直接作为UTF-8文本使用。
  2. 可变长度编码:UTF-8使用1至4个字节来表示不同范围的字符,根据Unicode字符的码点范围决定所需的字节数量。较常用的字符使用较少的字节,而较少使用的字符使用较多的字节表示,这样可以节省存储空间和传输带宽。
  3. 易于处理:UTF-8编码中,每个字节的高位会指示该字节是否为一个字符的起始字节,因此对UTF-8编码进行解码时,很容易找到每个字符的边界位置。

UTF-8的编码规则如下:

  • 对于ASCII字符(码点范围0~127),UTF-8使用1个字节表示,其二进制形式与ASCII编码一致。
  • 对于其他Unicode字符,UTF-8的编码规则如下:
    • 以字符的Unicode码点确定所需的字节数。
    • 根据需要的字节数,设置相应数量的起始字节,并在每个起始字节的高位标记该字节为非起始字节。
    • 将字符的码点中剩余的比特位分散存放在后续的字节中,使用特殊的前缀字节标识。

UTF-8编码示例:

  • 字符"A"的Unicode码点是U+0041,在UTF-8中使用1个字节表示,二进制形式为:01000001。
  • 字符"你"的Unicode码点是U+4F60,在UTF-8中使用3个字节表示,二进制形式为:11100100 10111110 10000000。

UTF-8的优势在于它能够兼容ASCII编码,同时提供了全面支持Unicode字符集的能力。它广泛应用于各种计算机系统、操作系统、编程语言和互联网协议中,成为事实上的标准字符编码方案。对于国际化和多语言支持的应用程序来说,使用UTF-8编码是十分重要的。


GB2312编码

GB2312编码是中国国家标准简体中文字符集的一种字符编码方案。它是在1980年代初制定的,主要用于表示汉字字符。

GB2312编码采用双字节编码方案,每个字节由高位和低位组成,,包括6,763个简体汉字和682个其它字符。它使用两个字节表示一个汉字,每个字节最高位都为0。每位都占用8个比特。其中,高字节的范围是0xB0-0xF7,低字节的范围是0xA1-0xFE。这样,GB2312共定义了7489个常用简体中文汉字和拉丁字母、数字、标点等其他字符

GB2312编码按照笔画数和发音进行了分组,通过查表的方式可以找到每个字符对应的编码值。例如,汉字“中”的GB2312编码是0xD6D0,其中“中”字在编码表中位于第一区,第二位序为16(0xD6),第二区,第二位序为48(0xD0)。

GB2312编码的优势在于提供了针对简体中文的统一编码方案,使得不同计算机系统和软件能够正确识别和显示简体中文字符。在GB2312之前,中国国内存在多种不兼容的字符编码方案,给信息交流和文字处理带来了很大困扰。

然而,GB2312编码的缺点在于它只包含有限数量的字符,无法表示繁体中文、其他语言字符以及一些特殊符号。为了解决这个问题,后来又出现了GBK和GB18030等更为完善的字符编码方案,它们能够支持更多的字符和字符集。

以汉字“中国”为例:

  • 汉字“中”的编码是0xD6D0,在编码表中可以找到它位于第一区,第二位序为16(0xD6),第二区,第二位序为48(0xD0)。
  • 汉字“国”的编码是0xB9FA,在编码表中可以找到它位于第一区,第一位序为2(0xB9),第二区,第四位序为90(0xFA)。

因此,将这两个汉字按照GB2312编码转换为字节序列,可以得到0xD6D0 0xB9FA。

需要注意的是,这里的编码值是十六进制表示的。在实际应用中,计算机会使用对应的比特位来表示这些编码值,并根据编码表进行解释和显示,以正确呈现相应的汉字。

Base64编码

Base64是一种将二进制数据编码为可打印字符的编码方案。它常用于在网络传输中传递二进制数据或存储二进制数据到文本文件中,因为文本文件只接受可打印字符。

Base64编码使用64个可打印字符来表示二进制数据,包括大写字母 A-Z、小写字母 a-z、数字 0-9,以及两个特殊字符 “+” 和 “/”。根据需要,可能还会添加一个填充字符 “=”。

Base64编码的原理如下:

  1. 将待编码的数据划分为每组3个字节(24比特)。
  2. 将每组3个字节拆解为4个6比特的片段。
  3. 将这些6比特片段转换为相应的Base64字符。每个6比特片段将映射到一个字符,总共产生4个Base64字符。
  4. 如果最后一组数据不足3个字节,会进行相应的填充处理。
  5. 最终得到的Base64字符序列就是编码后的结果。

以下是一个示例,将字符串 “Hello, World!” 进行Base64编码:

  1. 将字符串转换为对应的ASCII码:72 101 108 108 111 44 32 87 111 114 108 100 33。
  2. 将ASCII码转换为二进制形式:01001000 01100101 01101100 01101100 01101111 00101100 00100000 01010111 01101111 01110010 01101100 01100100 00100001。
  3. 将二进制数据划分为每组6比特:010010 000110 010101 101100 011011 011000 110111 000010 001011 000001 010111 011011 110000 100001 000010。
  4. 将每组6比特转换为Base64字符:
    • 010010 转换为 ‘S’
    • 000110 转换为 ‘G’
    • 010101 转换为 ‘V’
    • 101100 转换为 ‘s’
    • 011011 转换为 ‘b’
    • 011000 转换为 ‘4’
    • 110111 转换为 ‘3’
    • 000010 转换为 ‘A’
    • 001011 转换为 ‘X’
    • 000001 转换为 ‘B’
    • 010111 转换为 ‘X’
    • 011011 转换为 ‘b’
    • 110000 转换为 ‘w’
    • 100001 转换为 ‘E’
    • 000010 转换为 ‘A’
  5. 最终的Base64编码结果为:SGVsbG8sIFdvcmxkIQ==。

可以看到,经过Base64编码后,原始字符串被转换为了一串可打印字符。解码时,只需对这些Base64字符进行逆操作,即可还原原始的二进制数据。

你可能感兴趣的:(WEB安全,代码规范)