一、ASCII想象成一个只有128个格子的小抽屉:
- 每个格子都有个号码(0-127)
- 每个格子只能放一个英文字母或符号
- 就像一个很小的英文字典
二、Unicode编码想象成一个超大的图书馆:
- 有上百万个格子
- 能存放世界上所有语言的字符
- 就像一个多语言的超级字典
三、主要区别
容量不同:
-
ASCII:只能存128个字符
-
Unicode:可以存储上百万个字符
支持语言不同:
-
ASCII:主要支持英文
-
Unicode:支持全世界的语言
使用场景不同:
-
ASCII:简单的英文文本、老式的系统、需要节省空间时
-
Unicode:多语言网站、现代操作系统、手机应用
UTF-8和Unicode的关系:
- 在内存中,Python使用Unicode存储字符串
- 保存到文件或网络传输时,通常使用UTF-8编码
- UTF-8是最常用的Unicode实现方式
- 大部分现代系统默认使用UTF-8
- Unicode是字符集:它定义了一个庞大的字符集合以及每个字符的唯一编号(码点)。
- UTF-8是编码方式:它定义了如何将Unicode码点转换为实际的字节序列以便于存储或传输。
记住:
- Unicode是字符集(规定了字符和编号的对应关系):Unicode本身并不规定这些字符应该如何在计算机上存储或传输,它只是一个字符集,定义了哪些字符存在以及它们对应的唯一标识符。
- UTF-8是编码方式(规定了如何存储这些编号) :
是一种将字符集中的每个字符映射到一个特定的二进制代码的方法。计算机只能处理数字(即二进制数据),因此需要一种机制来表示文本中的字符。编码方式就是用来定义如何将字符转换为计算机可以理解和处理的数字形式。
- UTF-8是Unicode的一种节省空间的实现方式
简单来说,Unicode告诉你“每个字符是什么”,而UTF-8则告诉你“如何把这些字符表示成计算机能理解的形式”。
代码举例如下:
def demonstrate_ascii():
"""演示ASCII编码的基本概念"""
print("\n=== ASCII编码示例 ===")
# ASCII编码就像一个简单的对照表
simple_text = "A"
print(f"字母 'A' 的ASCII码是: {ord('A')}") # 输出65
print(f"数字 65 对应的字符是: {chr(65)}") # 输出A
# ASCII的局限性
try:
chinese = "中"
print(f"尝试用ASCII存储中文'中'...")
# 这里会报错,因为ASCII不支持中文
except Exception as e:
print("错误:ASCII不能存储中文!")
def demonstrate_unicode():
"""演示Unicode编码的基本概念"""
print("\n=== Unicode编码示例 ===")
# Unicode支持多种语言
text = "Hello, 你好, こんにちは"
print(f"Unicode可以同时显示多种语言: {text}")
# 查看字符的Unicode编码
print(f"'中'的Unicode编码是: {ord('中')}")
print(f"'A'的Unicode编码是: {ord('A')}")
def show_text_encoding():
"""通过具体例子解释Unicode和UTF-8的关系"""
print("\n=== 1. 基本概念演示 ===")
# Unicode: 字符 -> 数字(码点)
simple_text = "A"
unicode_point = ord(simple_text) # 获取Unicode码点
print(f"字符 'A' 在Unicode字典中的编号是: {unicode_point}") # 输出65
chinese_char = "中"
chinese_unicode = ord(chinese_char) # 获取中文字符的Unicode码点
print(f"字符 '中' 在Unicode字典中的编号是: {chinese_unicode}") # 输出20013
def show_encoding_process():
"""演示编码过程:Unicode -> UTF-8"""
print("\n=== 2. 编码过程演示 ===")
# 1. 英文字符
eng_text = "ABC"
# Unicode编号
unicode_numbers = [ord(char) for char in eng_text]
print(f"英文 '{eng_text}' 的Unicode编号: {unicode_numbers}")
# UTF-8编码(存储/传输时的格式)
utf8_bytes = eng_text.encode("utf-8")
print(f"英文 '{eng_text}' 的UTF-8编码: {utf8_bytes}")
print(f"UTF-8编码占用字节数: {len(utf8_bytes)}字节") # 3个字节,每个字母1字节
# 2. 中文字符
cn_text = "中国"
# Unicode编号
unicode_numbers = [ord(char) for char in cn_text]
print(f"\n中文 '{cn_text}' 的Unicode编号: {unicode_numbers}")
# UTF-8编码(存储/传输时的格式)
utf8_bytes = cn_text.encode("utf-8")
print(f"中文 '{cn_text}' 的UTF-8编码: {utf8_bytes}")
print(f"UTF-8编码占用字节数: {len(utf8_bytes)}字节") # 6个字节,每个汉字3字节
def show_decoding_process():
"""演示解码过程:UTF-8 -> Unicode -> 文本"""
print("\n=== 3. 解码过程演示 ===")
# 1. 混合文本
text = "Hello中国"
# 2. 编码过程
utf8_bytes = text.encode("utf-8")
print(f"文本 '{text}' 编码后: {utf8_bytes}")
# 3. 解码过程
decoded_text = utf8_bytes.decode("utf-8")
print(f"解码后的文本: {decoded_text}")
def practical_example():
"""实际应用场景示例"""
print("\n=== 4. 实际应用示例 ===")
# 1. 文件操作
filename = "test.txt"
text = "Hello世界"
# 写入文件(UTF-8编码)
with open(filename, "w", encoding="utf-8") as f:
f.write(text)
print(f"已写入文件: {text}")
# 读取文件(UTF-8解码)
with open(filename, "r", encoding="utf-8") as f:
content = f.read()
print(f"读取文件内容: {content}")
def main():
"""主函数"""
try:
demonstrate_ascii()
demonstrate_unicode()
show_text_encoding()
show_encoding_process()
show_decoding_process()
practical_example()
except Exception as e:
print(f"发生错误: {e}")
finally:
print("\n=== 程序执行完毕 ===")
if __name__ == "__main__":
main()
打印结果:
=== ASCII编码示例 ===
字母 'A' 的ASCII码是: 65
数字 65 对应的字符是: A
尝试用ASCII存储中文'中'...
=== Unicode编码示例 ===
Unicode可以同时显示多种语言: Hello, 你好, こんにちは
'中'的Unicode编码是: 20013
'A'的Unicode编码是: 65
=== 1. 基本概念演示 ===
字符 'A' 在Unicode字典中的编号是: 65
字符 '中' 在Unicode字典中的编号是: 20013
=== 2. 编码过程演示 ===
英文 'ABC' 的Unicode编号: [65, 66, 67]
英文 'ABC' 的UTF-8编码: b'ABC'
UTF-8编码占用字节数: 3字节
中文 '中国' 的Unicode编号: [20013, 22269]
中文 '中国' 的UTF-8编码: b'\xe4\xb8\xad\xe5\x9b\xbd'
UTF-8编码占用字节数: 6字节
=== 3. 解码过程演示 ===
文本 'Hello中国' 编码后: b'Hello\xe4\xb8\xad\xe5\x9b\xbd'
解码后的文本: Hello中国
=== 4. 实际应用示例 ===
已写入文件: Hello世界
读取文件内容: Hello世界
=== 程序执行完毕 ===