是否可以在没有字节序的情况下定义 UTF-16 和 UTF-32?

Could have UTF-16 and UTF-32 been defined without endianness?

现在我熟悉了 Unicode 和 UTF 字符编码。我也知道字节序:架构要么是小端,要么是大端,它们很有用,因为它们在低级硬件中的性能。但是为什么我们需要文本文件中的字节序呢?文件中的字符是从左到右存储的,即使我们使用不同的字节序也是如此。所以根据我的说法,在这种情况下,正确的字节序是大字节序。我更进一步:在将字符保存到文本文件时,我们甚至不应该谈论字节序。所以我的问题是,为什么不只有一个 UTF-16 和一个 UTF-32?有人可以给我举个例子吗?需要同时拥有 UTF16LE 和 UTF16BE / UTF32LE 和 UTF32BE 吗?

为了争论,让我们接受这个概念。您将有效的 UTF-16 定义为大端。好的,好的。

我正在一台小端机器上编写代码。我仍然需要能够读取、理解和操作 UTF-16 数据。因为我使用的是小端处理器(使用 C++ 作为示例语言),所以 char16_t 是小端。如果我要 bit_cast 将其转换为两个字符的数组,第一个字节将是最低有效字节。

因此,虽然您的交换格式将大端字节序指定为唯一有效的传输格式,但在我的机器中,它对我来说有用 UTF-16,直到它被转换成little-endian,我的机器实际上可以理解其中存储的值。因此,当我从有效的 UTF-16 流中读取字符数据时(使用您对有效性的定义),我必须先对其进行字节交换才能理解数据。

现在,假设我想通过某种传输机制(文件、互联网等)将 UTF-16 发送到另一个 program/machine。但无论出于何种原因,我知道接收过程肯定会在小端机器上运行。

为了以一种对您关于 UTF-16 应该如何传输的想法有效的方式执行此操作,我现在必须对每个 UTF-16 代码单元进行字节交换,传输交换后的数据,然后然后在可以理解之前在目的地对其进行字节交换。

事情的实际情况是:我不会那样做。我这样做绝对没有好处。最重要的是……你不能让我那样做

现实情况是这样的:只要小端机器存在并且相当广泛,至少对于某些应用程序来说,store/send/receive 本地 UTF-16LE 存储格式的数据会有一些实用性.只要做一件事有实用价值,工作的程序员就会去做。你可以告诉他们他们在做 UTF-16 传输错误,但他们会继续这样做。

所以你的选择是制定你知道不会被遵守的规则,或者制定接受其他人对事情应该如何有不同想法的规则。

请注意,这个问题与更严格的数据格式的问题不同。有明确为小端或大端的二进制数据格式。但一般来说,此类格式往往是严格指定的格式,必须符合一组严格的其他标准。通常会有一个一致性测试应用程序,您可以使用它来确保您的程序正确生成文件,并且以错误的字节序写入它会立即被视为 "incorrect".

纯文本行不通。没有人通过某些识别器推送他们的文本文件,除非文本 本身 预计符合特定格式(此时,它不再是 "plain text")。例如,XML 可能要求 UTF-16 编码的文本文件符合特定的字节序。但是纯文本太简单了;有太多的应用程序只想将 UTF-16 字符串转储到文件中,这不太现实。