📜  了解字符编码

📅  最后修改于: 2021-10-19 07:59:05             🧑  作者: Mango

有没有想过计算机如何能够理解和显示您所写的内容?有没有想过在您进行某些配置时 UTF-8 或 UTF-16 意味着什么?想想计算机应该如何解释“HeLLo World”。
我们都知道计算机以位和字节存储数据。因此,要在屏幕上显示字符或将字符映射为计算机内存中的字节需要有一个标准。阅读以下 :

\x48\x65\x4C\x4C\x6F\x20\x57\x6F\x72\x6C\x44

这是记忆会告诉你的东西。你怎么知道每个内存字节指定的字符是什么?

这是图片中的字符编码:

如果您还没有猜到——它是 UTF-8 格式的“你好世界”。是的,我们将继续阅读有关 UTF-8 的内容。但让我们从 ASCII 开始。大多数做过编程或处理过字符串一定知道什么是 ASCII。如果你还没有,那么让我们定义 ASCII 是什么。
ASCII: ASCII 代表美国信息交换标准代码。计算机只能理解数字,因此 ASCII 码是诸如“a”或“@”之类的字符或某种动作的数字表示。 ASCII 是很久以前开发的,现在非打印字符很少用于其原始目的。

只需看看以下内容——

Hexadecimal Decimal Character
\x48 110 H
\x65 145 e
\x4c 114 L

等等。您可以在 http://www.asciitable.com/ 上查看 ASCII 表和映射。如果您还没有看过表格,我会建议您现在就去做!您会发现这些是一组简单的英语单词和标点符号。

现在假设我想写以下字符:

一种
乙?@

这将被我的解码器解释为0x410x0a0x200x420x3f0x40 (十六进制)和065010032066063064 (十进制),其中甚至一个空格(0x20)和下一行(0x0a)都有一个字节值或内存空间。

不同的国家、语言,但将它们聚集在一起的需要

今天,互联网让世界变得更加紧密。世界各地的人不会只说英语,对吧?有必要扩大这个空间。如果您创建了一个应用程序,并且您看到法国人希望使用它,因为您看到那里的潜力很大。只是改变语言但具有相同的功能不是很好吗?

为什么不为每个人创建一个简短的 Unicode 通用代码?

所以,Unicode 带来了一个非常好的主意。它为每个字符(包括不同的语言)分配了一个称为代码点的唯一编号。 Unicode 相对于其他可能的集合的一个优点是它的前 256 个代码点与 ASCII 相同。因此,对于软件/浏览器,对计算机上使用的大多数现存语言的字符进行编码和解码会更容易。它的目标是,并且在很大程度上已经是所有其他已编码字符集的超集。

Unicode 也是一个字符集(不是编码)。它使用与 ASCII 标准相同的字符,但它使用附加字符扩展了列表,这为每个字符了一个代码点。它的目标是包含全世界使用的所有字符(和流行图标)。

在了解这些之前,让我们先了解一些术语

  • 字符是具有语义价值的最小文本单元。
  • 字符集是可能被多种语言使用的字符集合。示例:拉丁字符集被英语和大多数欧洲语言使用,而希腊字符集只被希腊语言使用。
  • 编码字符集是一个字符集,其中每个字符对应一个唯一的数字。
  • 编码字符集的一个代码点在字符集中的任何合法值。
  • 代码单元是一个位序列,用于在给定的编码形式内对曲目的每个字符进行编码。

有没有想过什么是 UTF-8 或 UTF-16??

UTF-8:自 2009 年以来,UTF-8 真正成为万维网的主导字符编码,截至 2017 年 6 月,它占所有网页的 89.4%。 UTF-8 使用一到四个 8 位字节对 Unicode 中的 1,112,064 个有效代码点中的每一个进行编码。具有较低数值的代码点,往往更频繁地出现,使用较少的字节进行编码。 Unicode 的前 128 个字符与 ASCII 一一对应,使用与 ASCII 具有相同二进制值的单个八位字节进行编码,因此有效的 ASCII 文本也是有效的 UTF-8 编码的 Unicode。

那么有多少字节可以访问这些编码中的哪些字符?
UTF-8:
1 字节:标准 ASCII
2 个字节:阿拉伯语、希伯来语、大多数欧洲文字(最显着的是不包括格鲁吉亚语)
3 字节:BMP
4 个字节:所有 Unicode字符

UTF-16:
2 字节:BMP
4 个字节:所有 Unicode字符

所以我确实提到了 BMP。究竟是什么?

基本多语言平面 (BMP) 包含几乎所有现代语言的字符,以及大量符号。 BMP 的一个主要目标是支持统一先前的字符集以及用于书写的字符。

UTF-8、UTF-16 和 UTF-32 是应用 Unicode字符表的编码。但是他们每个人的编码方式都略有不同。 UTF-8 在编码 ASCII字符时将仅使用 1 个字节,提供与任何其他 ASCII 编码相同的输出。但是对于其他字符,它将使用第一位来指示将跟随第二个字节。 UTF-16 默认使用 16 位,但这只能为您提供 65k 个可能的字符,对于完整的 Unicode 集来说还远远不够。所以有些字符使用成对的 16 位值。 UTF-32 相反,它使用最多的内存(每个字符固定 4 字节宽),这使得它非常臃肿,但现在在这种情况下每个字符都有这个精确的长度,因此字符串操作变得更加简单。你可以简单地从字符串的字节长度计算字符串中的字符数。你不能用 UTF-8 来做到这一点。这就是它如何轻松地适应不同语言的整个字符集,并帮助人们将他们的应用程序或信息传播到世界,只需用他们的语言编码/编写其余的一切都由解码器。

因为这只是进入字符编码世界的开始。我希望这可以帮助您在更高层次上理解字符编码。