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