大家好,我是可乐。
你是否有过在网页上看到一堆乱码,完全不知所云的经历?或者你试图打开一个文档,结果看到的都是奇怪的字符?这背后的元凶,很可能是字符编码。
这听起来像是一个高深的计算机名词,但实际上,不管你是学计算机或者不是学计算机的,它关乎我们每个人。
想象一下,你有没有经历过这样一个场景,你在与一个朋友进行通信,但是你们之间的距离很远,所以你们决定使用一种信号方式。你们都决定:把手举高意味着“是”或“好的”,把手放低意味着“不是”或“不好”。这就是一个简单的“编码”或“约定”:你们赋予特定的手势以特定的意义。
回到计算机这边,计算机原生只理解高低电平,只能识别二进制(0和1)。但我们人类使用的文本是字符、字母、数字和其他符号。所以,我们需要一个方法来告诉计算机:“嘿,当我给你这一串01时,我其实是想表示字母A。”这就是字符编码的起源。
于是,ASCII出现了。这是一个简单的编码表,用来告诉计算机:“嘿,当我说‘A’时,你可以用1000001
这串数字来表示。”就这样,英文与计算机之间的沟通桥梁被架起。
但英文并非唯一的语言。欧洲有很多其他的语言和符号。为此,ISO-8859-1出现了,它包含了大部分西欧语言的字符。
东方的文字千变万化,尤其是中文,每一个汉字都是一个小故事。但如何将它们“翻译”给只懂0和1的计算机呢?
中国的工程师们没有退缩。他们创建了GB2312和GBK编码,试图用数字语言告诉计算机每一个汉字的样子。
而在台湾和香港,Big5编码则担任这个重要任务。
但随着时间的流逝,人们意识到:我们需要一个全球通用的字符编码,而不是每个地方都有自己的编码。这就是Unicode的起源。它像是一个超大的“字典”,试图涵盖地球上所有的文字。
但是,仅有字典是不够的。我们还需要一种方法,让计算机能读懂这个字典。因此,UTF-8、UTF-16和UTF-32这几种“翻译方法”应运而生。
尤其是UTF-8,几乎成为了互联网的通用语言,因为它既能理解简单的英文字符,也能表达复杂的汉字或其他符号。
这里我重点说一下这两者的区别。
理解“UTF”与“Unicode”的区别是理解字符编码的关键之一。这两个词经常被人们混淆,但它们的目标和功能是有所区别的。
41
(十六进制),而“中”的存储形式是E4 B8 AD
(十六进制)。简单比喻:
想象Unicode是一本“世界语言词典”,其中为每个词(字符)分配了一个唯一的编号。而UTF则是这本词典的“打印格式”,规定了如何在纸上(或者在计算机的存储介质中)呈现这些编号。
总之,Unicode定义了字符与数字之间的关系,而UTF定义了如何存储和传输这些数字。
首先明确一下,UTF-8 是 Unicode 的一种可变长度字符编码。它使用一个到四个字节表示每个符号,取决于符号在 Unicode 中的编号。对于中文字符,UTF-8 通常使用三个字节进行编码。
这是因为中文字符在 Unicode 中的代码点大于 ASCII,但又小于需要四个字节编码的代码点。
要了解如何表示中文字符,我们可以先了解 UTF-8 的编码机制:
现在,我们以中文字符“中”为例,来看它是如何被 UTF-8 编码的:
100111000101101
。1110xxxx 10xxxxxx 10xxxxxx
。11100100 10111000 10101101
。所以,当你在一个 UTF-8 编码的文本文件中看到这三个连续的字节 E4 B8 AD,就知道这代表中文字符“中”。
这种编码方式允许 UTF-8 同时具有与 ASCII 编码的兼容性,并能够表示所有的 Unicode 字符。对于中文字符,它通常使用三个字节,但对于某些特别的字符或表情符号,可能需要四个字节。
每次我们在浏览器中打开一个网页,或在计算机上读取一个文档,背后都有一套编码在默默地工作。你可能在某些网页的底部看到过“UTF-8”或“GBK”这样的标签。这其实是告诉计算机:“嘿,这个页面的文字,请按照这种规则来读。”
所以看完上面的,你可能会问,既然我们有了那么多高科技,为什么还会遇到乱码问题?
原因有很多,但最常见的是:文件或网页的原始编码与我们所使用的软件或设备预期的编码不匹配,比如网页是用ISO编码,但是我们是用GBK打开。
这就像我们试图用法语读英文一样,结果自然是不对劲的。
随着当前机器学习、ChatGPT类似AI的兴起,我们也可以期待一下,在不久的将来,你的计算机或手机或许能够自动检测并修复乱码问题,那么【手持两把锟斤拷,口中疾呼烫烫烫】也将成为历史!!!