Logo
Section 1 / 12

字符编码简史

了解字符编码的简要历史,包括字符串转换。

导入

字符编码简史

了解字符编码的简要历史,包括字符串转换。

字符串简介

对于一门旨在通过 Laravel 字符串辅助函数来探索 PHP 字符串的课程来说,显然应该从最基础的问题开始:什么是字符串?人们可能会立刻想到,字符串不过是一系列字符的集合。表面上看,这个回答似乎已经足够,但仅仅在课程开始三句话之后,我们就遇到了第一个问题,而这又引出了更多疑问。

...
字符与字符串的区别

第一个问题可能是:什么是字符?当我们查看屏幕上的文字或印刷品时,自然会认为每一个视觉上独立的书写单位就是一个字符。例如,如果你从小说英语并用英语书写,那么看到下面这段文字时,你会立刻意识到它包含十六个不同的字符:

1Hello wilderness

但再来看下面这段文字呢?

1你好荒野

由于你正在学习的是数字课程,可以逐个高亮其中的字符,你会发现这段文字实际上只包含四个字符。为了进一步确认这一点,我们使用 PHP 的 strlen 函数来统计这个字符串中的字符数量:

1 2strlen 函数返回的结果是 12,这很有趣!难道函数出错了?让我们用它来统计英文文本的字符数看看: 3 4这次函数返回了 16,这正是我们文本中字符的正确数量。到底发生了什么?要回答这个问题,我们需要退一步思考:计算机内存中是如何存储和表示文本的? 5字符编码的历史 6假设我们必须设计一种紧凑的方式来在两个群体之间传递信息,既要减少传输的数据量,又不能丢失任何信息。假设我们只需处理单词,而不需要数字或特殊符号。我们可以分析双方之前的通信记录,找出频繁出现的词汇和短语,并将它们用数字或符号代替。当发送新消息时,就用对应的数字或符号替换这些词组。接收方读取消息时,对照编码表反向还原,就能恢复原始内容。这样我们就建立了一种编码方案——一种数据的表示与解读方式。 7回顾计算机系统中文字数据和字符编码的发展历史,很快就会提到 ASCII(American Standard Code for Information Interchange,美国信息交换标准代码),它起源于贝尔实验室开发的电报编码。在计算机发展的早期,每个公司或组织都会自行设计一套独特的文本存储方式,即创建自己的字符编码系统。这些系统通常互不兼容。直到 20 世纪中期到晚期,在当时美国标准协会的支持和指导下,各方才致力于制定统一的文本编码标准。 8这项工作直到 1968 年 3 月 11 日才真正获得广泛采纳,当时美国总统林登·B·约翰逊下令将 ASCII 成为美国联邦标准。除了推动其成为国家标准外,总统还规定自 1969 年 7 月 1 日起,所有由美国政府采购的计算机及相关设备必须支持 ASCII 编码。从那时起,尽管后续经历了多次修订,但这一标准逐渐普及。到了 1981 年,IBM 在其首款个人电脑中采用了 ASCII 编码。 9我们略过许多历史细节,但已有足够的背景知识继续深入。现在,我们来理解这一切如何与 strlen 函数在统计繁体中文文本字符数量时出现错误结果相关联。首先需要了解的是:ASCII 最初是一个 7 位编码标准,能够表示 128 个字符。其优点在于,每个字符都可以用一个字节在计算机中轻松表示,换句话说,每个字符对应一个介于 0 到 255 之间的整数,这正是单个字节所能表示的最大值。 10如果我们用以下代码将我们的英文字符串转换为字节数组: 11 12如果查对 ASCII 表,就会发现这些数值正好对应原字符串中的每一个字符。现在再来看看这段代码的结果: 13 14你可能会注意到,我们的繁体中文字符串被解析为一个包含十二个不同数值的字节数组。这就引出了关键点:strlen 函数统计的是字节数,而不是字符数。 15对于 ASCII 中的英文字符来说,字节数等于字符数,因为每个英文字符都仅占用一个字节。但在繁体中文文本中情况不同。我们来逐一拆解每个字符,查看它们生成的字节数组: 16// unpack('C*', '你'); 17array:3 [ 18 1 => 228 19 2 => 189 20 3 => 160 21] 22 23// unpack('C*', '好'); 24array:3 [ 25 1 => 229 26 2 => 165 27 3 => 189 28] 29 30// unpack('C*', '荒'); 31array:3 [ 32 1 => 232 33 2 => 141 34 3 => 146 35] 36 37// unpack('C*', '野'); 38array:3 [ 39 1 => 233 40 2 => 135 41 3 => 142 42] 43如你所见,每个字符都由多个字节组成,这也正是 PHP 多字节字符串函数中“多字节”一词的由来。PHP 提供了多个多字节字符串函数,其中之一就是 mb_strlen,它是 strlen 的多字节版本。用它来处理我们的繁体中文文本,返回的结果是 4,这与我们肉眼观察到的数量一致:

简介

Unicode 和 UTF-8