Skip to content

字符、编码与字符串长度

本节学习字符、编码和字符串长度之间的关系。

在初学阶段,我们常常把字符串理解成“一个字符一个位置”。这个理解在处理简单英文字符时基本够用,但遇到中文、表情符号或不同编码时,就会发现字符数量、字节数量和语言中的长度计算并不总是完全一致。


字符是文本中的符号,例如 A😊

字节是计算机存储数据的基本单位之一。一个字符在内存或文件中可能需要一个或多个字节表示,具体取决于编码方式。

例如,在 UTF-8 编码中:

  • 英文字母通常占 1 个字节。
  • 常见中文字符通常占 3 个字节。
  • 某些表情符号可能占更多字节。

因此,字符串长度这个词在不同语境下可能有不同含义:它可能指字符数量,也可能指字节数量,还可能指语言内部的编码单元数量。


如果只处理英文字符串,很多问题都比较直接。但在真实开发中,文本可能包含多种语言字符。

例如:

hello
你好
hello你好

如果程序按字节截断字符串,可能会把一个中文字符的字节切开,导致乱码或解析失败。

因此,处理字符串时要清楚自己操作的是字符、字节,还是某种编码单元。


下面展示四种语言中获取字符串长度的常见方式。

string text = "hello";
int length = text.size();

对于简单英文字符串 hello,这些写法都会得到 5。因为它有 5 个字符,并且每个字符也很容易对应到一个位置。

但遇到更复杂的 Unicode 字符时,不同语言的长度含义可能不同。学习数据结构时,我们先以“字符序列”建立基本模型;进入工程实践时,再进一步关注具体编码细节。


字符串通常支持按位置访问字符。

string text = "hello";
char ch = text[1];

这四段代码都访问了下标为 1 的字符,也就是 e

需要注意的是,这类按位置访问在简单字符场景下很直观;但涉及复杂 Unicode 字符时,语言中的 char 或下标单位未必等同于用户眼中的“一个完整字符”。


大多数编程语言中的字符串下标从 0 开始。

对于字符串 hello

h 的下标是 0
e 的下标是 1
l 的下标是 2
l 的下标是 3
o 的下标是 4

如果字符串长度是 nn,最后一个合法下标通常是 n1n - 1

越界访问是字符串处理中常见错误。例如长度是 5 的字符串,不能访问下标 5,因为下标 5 已经超过最后一个位置。


字符是文本符号,字节是存储单位,编码决定字符如何转换成字节。

学习数据结构时,可以先把字符串理解成字符序列;但在真实开发中,必须知道字符串长度可能涉及字符数量、字节数量或编码单元数量。处理中文、表情符号和多语言文本时尤其要注意这一点。