ASCII与Unicode编码

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工具指引

在线 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-16Unicode 编码方式,使用 2 或 4 个字节表示字符
utf-32Unicode 编码方式,使用 4 个字节表示字符
ascii仅支持 7 位 ASCII 字符(0-127),不支持非英文字符
latin-1ISO 8859-1 编码,支持西欧语言字符
gbk中文编码方式,支持简体中文字符
gb2312中文编码方式,早期的简体中文标准
big5中文编码方式,支持繁体中文字符
unicode_escape将字符串中的 Unicode 字符转义为 \uXXXX 格式
raw_unicode_escape类似 unicode_escape,但不对反斜杠进行额外转义
base64一种将二进制数据编码为文本的方式,常用于网络传输
hex将数据编码为十六进制字符串

关于解码与编码方法的使用示例可以参考Unicode编码转换器

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值