【问题标题】:Can someone explain the sequence of events that occurs in the encoding/decoding process?有人可以解释编码/解码过程中发生的事件顺序吗?
【发布时间】:2020-09-22 00:42:00
【问题描述】:

我正在努力巩固我对编码和解码的理解。我不确定事件序列在不同设置中的工作方式:

  1. 当我在我的电脑上打字时,电脑(或我正在使用的任何程序)是否会自动以 UTF-8(或使用的任何编码)解码我的字母
  2. 当我保存一个文件时,它是否会使用用于解码我的文本的编码标准自动保存它?假设我将该文档或数据集发送给某人,我是否向他们发送了一堆 1 和 0?然后他们的解码器会根据他们指定的任何默认或编码标准对其进行解码?
  3. 代码点如何参与其中?我的计算机是否也有它使用的默认代码点字典?
  4. 如果以上情况属实,我如何知道我的计算机/程序正在使用哪种解码/编码?

抱歉,如果这不清楚,或者我误解/使用了不正确的术语。

【问题讨论】:

    标签: unicode encoding utf-8 character-encoding


    【解决方案1】:

    有几种方法可以做到这一点,但这是一种可能性。

    首先,是的,在某种程度上,计算机会将您键入的每个字母“解码”为某种编码。每次按下键盘上的键时,都会关闭一个电路,该电路会向计算机中的其他硬件(例如键盘控制器)发出一个键被按下的信号。然后,该硬件会使用有关键盘事件(向上键、向下键、重复键)的信息填充缓冲区并向 CPU 发送中断。

    当 CPU 接收到中断时,它会跳转到内存中硬件定义的位置并开始执行它找到的代码。该代码通常会检查哪个设备发送了中断,然后跳转到具有处理特定设备发送的中断的代码的其他位置。然后,此代码将从设备上的缓冲区中读取“scan code”,以确定发生了哪个键事件。

    然后操作系统处理扫描代码并将其传递给等待键盘输入的应用程序。它可以做到这一点的一种方法是使用与按下的键(或多个键)相对应的 UTF-8 编码字符填充缓冲区。当应用程序从操作系统接收回控制权时,它会读取缓冲区。

    要回答您的第二个问题,我们首先必须记住您在文件中输入数据时会发生什么。在您键入时,您的应用程序会收到与您按下的键相对应的字母(可能是 UTF-8 编码的,如上所述)。现在,您的应用程序将需要跟踪它收到了哪些信件,以便以后可以将您输入的数据保存到文件中。它可以做到这一点的一种方法是在程序启动时分配一个缓冲区,然后在接收到每个字符时将其复制到缓冲区中。如果字符是从 OS UTF-8 编码传递的,那么您的应用程序可以简单地将这些字节复制到另一个缓冲区。当您继续键入时,您的缓冲区将继续由操作系统提供的字符填充。当需要保存文件时,您的应用程序可以要求操作系统将缓冲区的内容写入文件或通过网络发送它们。磁盘或网络接口的设备驱动程序知道如何将此数据发送到适当的硬件设备。例如,要写入磁盘,您可能必须将数据写入缓冲区,写入磁盘控制器上的寄存器以发出将缓冲区中的数据写入磁盘的信号,然后重复从磁盘上的另一个寄存器读取磁盘控制器检查写入是否完成。

    第三,Unicode 为每个字符定义了一个代码点。每个代码点都可以用一种以上的方式进行编码。例如,代码点 U+004D(“拉丁大写字母 M”)可以在 UTF-8 中编码为 0x4D,在 UTF-16 中编码为 0x004D,或者在 UTF-32 中编码为 0x0000004D(参见@987654322 中的表 3-4 @)。如果您在内存中有数据,则使用某种编码对其进行编码,并且有可用的库可以将一种编码转换为另一种编码。

    最后,您可以通过检查设备驱动程序来了解您的计算机如何处理键盘输入。您可以从查看一些 Linux 驱动程序开始,因为其中许多是开源的。然而,每个程序都可以根据自己的选择对数据进行编码和解码。您必须检查每个单独程序的代码以了解其编码和解码的工作原理。

    【讨论】:

    • 感谢您的帮助,非常感谢您抽出宝贵时间如此彻底地回答。我将通读几遍,并了解您提到的一些术语。一旦我完全理解,我会点击已回答的复选标记(如果这对您很重要)。
    【解决方案2】:

    这是一个复杂的问题,也因为它取决于很多事情。

    当我在我的电脑上打字时,电脑(或我正在使用的任何程序)是否会自动以 UTF-8(或使用的任何编码)解码我的字母

    这是非常复杂的。一些程序获取键盘代码(例如游戏),但大多数程序使用操作系统服务来解释键盘代码(考虑各种键盘布局,还可以根据 Shift、Control 等修改结果)。

    所以,这取决于您获得的编码的操作系统和程序。对于终端程序,进程的语言环境还包括标准输入/标准输出(标准输入和标准输出)的编码。对于图形界面,您可能会得到不同的编码(根据系统编码)。

    但是UTF-8是一种编码,所以你用错了UTF-8中的解码这个词。

    当我保存文件时,它是否会使用用于解码我的文本的编码标准自动保存它?假设我将该文档或数据集发送给某人,我是否向他们发送了一堆 1 和 0?然后他们的解码器会根据他们指定的任何默认或编码标准对其进行解码?

    这是复杂的部分。许多系统和计算机语言都,因此它们被设计为仅使用一种系统编码。例如。 C语言。所以没有真正的解码。程序直接使用编码,它们硬编码字母A 具有特定值。对于计算机,只有数值很重要。只有在打印数据时,才会以复杂的方式(字体、字符大小、连字、下一行……)解释事物。 [而且如果你使用字符串函数,你明确告诉程序使用数字作为字符串]。

    某些语言(和 HTML:您查看由外部机器生成的页面,因此系统编码不太一样)引入了 解码 部分:在程序内部,您只有一种方法可以表示一个字符串(例如,使用 Unicode 代码点)。但是为了有这样统一的格式,我们需要对字符串进行解码(但是,现在我们可以处理不同的编码,并且不受系统编码的限制)。

    如果你保存一个文件,它会有一个字节序列。要解释(也称为解码),您需要知道哪个编码具有文件。一般来说,您应该知道它,或提供(例如作为 HTML)带外信息(“以下文件是 UTF-8”,例如在 HTTP 标头中,或在扩展名中,或在数据库的字段定义中,或...)。有些系统(微软Windows)使用BOM(Byte order mark)来区分UTF-16LE、UTF-16BE、UTF-8,还有旧系统编码(有人叫ANSI,其实不是ANSI,可能很多不同的代码页)。

    解码器:通常它应该知道编码,否则它使用默认值,或者猜测它。 HTML 有一个要执行的步骤列表以进行估算。上面的 BOM 方法可能会有所帮助。一些工具会检查常见的字符组合(各种语言)。但这仍然是魔法。如果没有 BOM 或带外数据,我们只能进行估算,而且经常会出错。

    代码点如何参与其中?我的计算机是否也有它使用的默认代码点字典?

    码位是 Unicode 的基础。每个“字符”都有一个代码点:一个带有描述的固定编号。这是抽象的。在 UTF-32 中,您使用相同的数字进行编码(使用 32 位整数),在所有其他编码中,您有一个从代码点到编码值(以及返回方式)的函数(或映射)。代码点只是描述字符语义(即含义)的数值。为了传输这些信息,通常我们需要一个编码(或者只是一个转义序列,例如 U+FFFF 表示(作为文本)BOM 字符)。

    如果上述情况属实,我如何知道我的计算机/程序使用的是哪种解码/编码?

    没人能回答:你的电脑会使用很多编码。

    MacOS、Unix、POSIX 系统:现代系统(而不是 root 帐户):它们可能会使用 UTF-8。 Root 可能只使用 ASCII(7 位)。

    Windows:它在内部经常使用 UTF16。输出取决于程序,但几乎总是使用 8 位编码(所以不是 UTF16)。 Windows 可以读取和写入几种编码。您可以向系统询问默认编码(但如果需要,程序仍然可以使用 UTF-8 或其他编码编写)。终端和设置可以为您在不同程序上提供不同的默认编码。

    因此,如果您在 Windows 中编程,则应将文件显式保存为 UTF-8(我的建议),并可能使用 BOM(但如果您需要与非 Windows 机器互操作,在这种情况下,请忽略 BOM,但您应该已经知道此类文件必须是 UTF-8)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 1970-01-01
      • 2018-01-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多