ASCII与Unicode编码
简介
- ASCII(American Standard Code for Information Interchange)即美国信息交换标准代码,它是基于拉丁字母的一套电脑编码系统,也是现今最通用的单字节编码系统;ASCII 编码使用 7 位二进制数来表示一个字符,这样可以表示 2^7 = 128 个不同的字符,这些字符包括英文字母(大写和小写)、数字(0 - 9)、标点符号以及一些控制字符(如换行符、回车符等)
- 数字 0 - 9 的 ASCII 码范围是 48 - 57,例如字符 ‘0’ 的 ASCII 码是 48,字符 ‘1’ 的 ASCII 码是 49
- 大写字母 A - Z 的 ASCII 码范围是 65 - 90,比如字符 ‘A’ 的 ASCII 码是 65,字符 ‘B’ 的 ASCII 码是 66
- 小写字母 a - z 的 ASCII 码范围是 97 - 122,像字符 ‘a’ 的 ASCII 码是 97,字符 ‘b’ 的 ASCII 码是 98
ASCII 编码主要是为英语语言设计的,只能表示 128 个字符,对于其他语言(如中文、日文、阿拉伯文等)的字符无法表示,在ASCII编码中每个码点对应一个字节,例如字符 A
的码点是 65(十六进制为 41
),在 ASCII 编码中就用 1 个字节 01000001
来表示
- Unicode 是一种国际标准字符集,它为世界上几乎所有的字符都分配了一个唯一的数字编号(码点),旨在解决不同语言和符号在计算机中的统一编码问题;Unicode 编码的码点范围非常大,目前已经可以表示超过 140,000 个字符,Unicode 本身只是一个字符集,规定了字符与数字编号的对应关系,但并没有规定这些编号如何在计算机中存储和传输,因此需要不同的编码方案来实现,常见的编码方案有 UTF - 8、UTF - 16 和 UTF - 32
- UTF - 8:是一种可变长度的 Unicode 编码,它使用 1 到 4 个字节来表示一个字符,对于 ASCII 字符,UTF - 8 编码和 ASCII 编码是相同的,只使用 1 个字节,这使得 UTF - 8 可以很好地兼容 ASCII 编码,对于其他语言的字符,根据字符的复杂程度,可能会使用 2 到 4 个字节来表示
- UTF - 16:使用 2 个或 4 个字节来表示一个字符,通常用于处理像中文、日文等东亚语言的文本,它可以更高效地表示一些常用的字符,但对于 ASCII 字符,会浪费一些存储空间
- UTF - 32:使用 4 个字节来表示一个字符,无论字符是什么,都固定使用 4 个字节,这样可以简单直接地表示任何 Unicode 字符,但会占用较多的存储空间
比如汉字 中
的 Unicode 码点是 U+4E2D,在 UTF - 8 编码中,它用 3 个字节表示,即 E4 B8 AD
,其中 E4
是十六进制,转换为二进制就是 11100100
,所以也是一个字节;在 UTF - 16 编码中,用 2 个字节表示;在 UTF - 32 编码中,用 4 个字节表示;Unicode 编码解决了不同语言字符编码不兼容的问题,使得计算机可以统一处理各种语言的文本,促进了全球范围内的信息交流和共享
UTF - 8
UTF - 8 是一种可变长度的字符编码,它可以使用 1 到 4 个字节来表示不同的字符
- 对于码点范围在
U+0000 - U+007F
的字符(即 ASCII 字符),使用 1 个字节表示,与 ASCII 编码相同 - 对于码点范围在
U+0080 - U+07FF
的字符,使用 2 个字节表示 - 对于码点范围在
U+0800 - U+FFFF
的字符,使用 3 个字节表示,大多数常见的中文字符都在这个范围内 - 对于码点范围在
U+10000 - U+10FFFF
的字符,使用 4 个字节表示,一些特殊的符号、表情符号等属于这一范围
1. ASCII 字符
# 定义一个 ASCII 字符
ascii_char = 'A'
# 编码为 UTF - 8
utf8_encoded = ascii_char.encode('utf-8')
print(f"字符 '{ascii_char}' 的 UTF - 8 编码: {utf8_encoded}")
print(f"十六进制表示: {utf8_encoded.hex()}")
# 输出 字符 'A' 的 UTF - 8 编码: b'A'
# 输出 十六进制表示: 41
# 十六进制41转换为十进制即 4 * 16^1 + 1 * 16^0 = 65,对应ASCII中的A
2. 中文字符
# 定义一个中文字符
chinese_char = '你'
# 编码为 UTF - 8
utf8_encoded = chinese_char.encode('utf-8')
print(f"字符 '{chinese_char}' 的 UTF - 8 编码: {utf8_encoded}")
print(f"十六进制表示: {utf8_encoded.hex()}")
# 输出 字符 '你' 的 UTF - 8 编码: b'\xe4\xbd\xa0'
# 输出 十六进制表示: e4bda0
3. 特殊符号
# 定义一个全角逗号
fullwidth_comma = ','
# 编码为 UTF - 8
utf8_encoded = fullwidth_comma.encode('utf-8')
print(f"字符 '{fullwidth_comma}' 的 UTF - 8 编码: {utf8_encoded}")
print(f"十六进制表示: {utf8_encoded.hex()}")
# 输出 字符 ',' 的 UTF - 8 编码: b'\xef\xbc\x8c'
# 输出 十六进制表示: efbc8c
4. 表情符号
# 定义一个表情符号
emoji = '😀'
# 编码为 UTF - 8
utf8_encoded = emoji.encode('utf-8')
print(f"字符 '{emoji}' 的 UTF - 8 编码: {utf8_encoded}")
print(f"十六进制表示: {utf8_encoded.hex()}")
# 输出 字符 '😀' 的 UTF - 8 编码: b'\xf0\x9f\x98\x80'
# 输出 十六进制表示: f09f9880
Unicode工具指引
SYMBL (◕‿◕) 符号、Emoji、字符、脚本、字母表、象形文字和整个Unicode
编码与解码
编码和解码是处理字符串和字节数据的常用操作
1.编码
encode:编码是将字符串 str
转换为字节 bytes
的过程
# 定义一个字符串
text = "你好,Python!"
# 使用 UTF-8 编码
encoded_text = text.encode('utf-8')
print(encoded_text) # 输出:b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cPython!'
# 使用 GBK 编码
encoded_text_gbk = text.encode('gbk')
print(encoded_text_gbk) # 输出:b'\xc4\xe3\xba\xc3\xa3\xacPython!'
2.解码
decode:解码是将字节 bytes
转换为字符串 str
的过程
# 定义一个字节数据(UTF-8 编码)
byte_data = b'\xe4\xbd\xa0\xe5\xa5\xbd\xef\xbc\x8cPython!'
# 使用 UTF-8 解码
decoded_text = byte_data.decode('utf-8')
print(decoded_text) # 输出:你好,Python!
# 定义一个字节数据(GBK 编码)
byte_data_gbk = b'\xc4\xe3\xba\xc3\xa3\xacPython!'
# 使用 GBK 解码
decoded_text_gbk = byte_data_gbk.decode('gbk')
print(decoded_text_gbk) # 输出:你好,Python!
3.错误处理
解码或者编码的过程中可能遇到无法处理的字符会抛出异常,可以通过 error
参数来处理这些错误
# 定义一个字符串
text = "你好,Python! 😊"
# 使用 GBK 编码(GBK 不支持 😊)
encoded_text = text.encode('gbk', errors='ignore')
print(encoded_text) # 输出:b'\xc4\xe3\xba\xc3\xa3\xacPython! '
# 使用 GBK 编码(替换错误字符)
encoded_text_replace = text.encode('gbk', errors='replace')
print(encoded_text_replace) # 输出:b'\xc4\xe3\xba\xc3\xa3\xacPython! ?'
4.字节对象
bytes
构造函数也可以直接从字符串创建字节对象,但必须指定 encoding
参数
# 从字符串创建字节对象
byte_data = bytes("你好", encoding='utf-8')
print(byte_data) # 输出:b'\xe4\xbd\xa0\xe5\xa5\xbd'
# 从整数列表创建字节对象
byte_data = bytes([65, 66, 67])
print(byte_data) # 输出:b'ABC'
# 创建指定长度的空字节对象
byte_data = bytes(5)
print(byte_data) # 输出:b'\x00\x00\x00\x00\x00'
encode
方法只可对字符串对象使用,bytes
方法可以是字符串、整数列表或长度(创建空字节对象)
5.常见方式
编码名称 | 描述 |
---|---|
utf-8 | 通用的 Unicode 编码方式,支持所有字符,常用且推荐 |
utf-16 | Unicode 编码方式,使用 2 或 4 个字节表示字符 |
utf-32 | Unicode 编码方式,使用 4 个字节表示字符 |
ascii | 仅支持 7 位 ASCII 字符(0-127),不支持非英文字符 |
latin-1 | ISO 8859-1 编码,支持西欧语言字符 |
gbk | 中文编码方式,支持简体中文字符 |
gb2312 | 中文编码方式,早期的简体中文标准 |
big5 | 中文编码方式,支持繁体中文字符 |
unicode_escape | 将字符串中的 Unicode 字符转义为 \uXXXX 格式 |
raw_unicode_escape | 类似 unicode_escape ,但不对反斜杠进行额外转义 |
base64 | 一种将二进制数据编码为文本的方式,常用于网络传输 |
hex | 将数据编码为十六进制字符串 |
关于解码与编码方法的使用示例可以参考Unicode编码转换器