这是一个复杂的问题,也因为它取决于很多事情。
当我在我的电脑上打字时,电脑(或我正在使用的任何程序)是否会自动以 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)。