一、 Bit(位)
- 定义: 计算机中最小的数据单位,一个二进制位。
- 核心概念:
- 状态只有两种:
0或1(开/关、真/假、高/低电压)。 - 它是所有数据的物理基础。
- 状态只有两种:
- 程序员视角:
- 在底层开发、嵌入式、协议解析、位运算(
&,|,~,^,<<,>>)中经常直接操作位,用于优化存储、设置标志位等。 - 类比: 比特就像原子,是构成物质的基本单元。
- 在底层开发、嵌入式、协议解析、位运算(
二、Byte(字节)
- 定义: 由 8个bit 组成的序列。这是计算机信息处理的标准最小可寻址单元。
- 核心关系:
1 Byte = 8 bits。 - 为什么是8位?
- 历史原因(字节长度曾不固定),但8位能表示
2^8 = 256个不同的值,足够覆盖英文字母、数字、标点和控制字符,成为一个在效率和成本上很好的平衡点。
- 历史原因(字节长度曾不固定),但8位能表示
- 程序员视角:
- 我们很少直接操作bit,绝大多数情况都是在操作byte。
- 内存地址指向的是字节,而不是位。
- 在C/C++中,
char类型是1个字节。在Java/C#中,byte类型也是1个字节。 - 类比: 字节就像分子,由原子(bit)组成,是具备特定功能的基本单位。
三、 解码:从数字到英文字符——ASCII 编码
- 问题: 计算机如何用字节表示字符?
- 解决方案: ASCII 码。
- 用一个字节(8位)中的后7位来表示128个字符(包括英文字母、数字、标点等)。
- 例如:
A->65->01000001(一个字节)。
- 关键点: 在纯英文环境下,一个字符 ≈ 一个字节。这个概念非常重要,但也正是理解中文编码的“陷阱”。
四、 汉字与多字节字符集
-
问题: 汉字数量庞大(成千上万),一个字节的256种可能远远不够。
-
解决方案: 使用多个字节来表示一个汉字。
a) GB2312 / GBK(国标码)
- 原理: 使用 2个字节 表示一个汉字(以及一些特殊符号)。
- 范围: 第一个字节(高字节)从
0xA1开始,第二个字节(低字节)从0xA1开始。这构成了一个巨大的“表格”,可以容纳数千个汉字。 - 程序员视角: 在GBK编码下,一个汉字 = 2个字节。这是早期中文Windows系统的默认编码。
b) Unicode(万国码)
- 目标: 为全世界所有字符提供一个唯一的数字编号(称为码点,Code Point)。
- 关键: Unicode 只定义编号,不定义如何存储! 例如,“汉”字的Unicode码点是
U+6C49(一个抽象的标识符)。
c) UTF-8(Unicode 的传输格式)—— 互联网标准
- 原理: 一种变长的Unicode实现方式。它非常聪明:
- ASCII 字符(0-127): 用 1个字节 存储,与ASCII完全兼容。
- 大多数汉字等字符: 用 3个字节 存储。
- 其他字符可能占用2或4个字节。
- 存储“汉”字 (
U+6C49):- Unicode 码点
U+6C49位于0800-FFFF范围内,根据UTF-8规则,需要3个字节。 - 经过编码计算,最终在硬盘或内存中存储为三个字节:
E6 B1 89(十六进制)。
- Unicode 码点
- 程序员视角:
- 在UTF-8编码下,一个汉字通常 = 3个字节。
- UTF-8是现代Web、Linux系统、以及跨平台应用的首选编码。你的代码文件、数据库、网络传输都应优先考虑UTF-8。
五、 总结与关系梳理
| 概念 | 英文 | 关系与大小 | 角色与作用 |
|---|---|---|---|
| 位 | Bit (b) | 最小单位,0或1 | 数据的物理基石 |
| 字节 | Byte (B) | 1 Byte = 8 Bits | 计算机寻址和操作的基本单元 |
| 英文字符 | - | 1 Char ≈ 1 Byte (ASCII) | 基础文本表示 |
| 汉字 | - | 1 Hanzi = 2 Bytes (GBK) | 本地化编码方案 |
| 1 Hanzi ≈ 3 Bytes (UTF-8) | 现代跨平台应用的通用方案 |
核心关系链:
Bit (0/1) -> 组成 Byte (8 bits) -> 根据编码规则 (如UTF-8) -> 解释为字符 (包括汉字)
六、 实战建议
- 明确编码: 在读写文件、进行网络通信、连接数据库时,必须明确指定字符编码(如UTF-8),否则就会出现乱码。
- 字符串长度 vs 存储大小:
string.length()(在很多语言中)返回的是码元单位数或字符数,而不是字节数。- 要获取字节数,需要使用特定方法,如Python的
len(s.encode('utf-8'))或Java的s.getBytes("UTF-8").length。
- 数据库字段设置: 设置为
VARCHAR(100)表示可以存储100个字符,但实际占用的磁盘空间取决于这些字符的类型和编码(UTF-8下,100个汉字可能需要约300字节)。

3665

被折叠的 条评论
为什么被折叠?



