Unicode UTF-16和UTF-32是否可以定义为没有端点?

Unicode UTF-16和UTF-32是否可以定义为没有端点?,unicode,endianness,utf-16,utf,Unicode,Endianness,Utf 16,Utf,现在我熟悉Unicode和UTF字符编码。我也知道endianness:一个体系结构要么是小的,要么是大的Endians,它们很有用,因为它们在低级别硬件中的性能。但是为什么我们在文本文件中需要endian呢?文件中的字符是从左到右存储的,即使我们使用不同的Endian。因此,根据我的说法,在这种情况下,正确的endian就是big endian。我更进一步:在将字符保存到文本文件时,我们甚至不应该谈论Endian。所以我的问题是,为什么不只有一个UTF-16和一个UTF-32?有人能给我举个例

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

为了论证起见,让我们考虑一下这个概念。您将有效的UTF-16定义为big-endian。好的

我在一台小小的endian机器上写代码。我仍然需要能够读取、理解和操作UTF-16数据。因为我使用的是一个小的EndiaPosiver(使用C++作为示例语言),<代码> CHAR16VT 是小字节。如果我将它转换成两个字符的数组,第一个字节将是最低有效字节

因此,虽然您的交换格式指定big-endian作为唯一有效的传输格式,但在我的机器中,UTF-16对我来说没有用处,除非它转换为little-endian,我的机器可以真正理解其中存储的值。因此,当我从一个有效的UTF-16流中读取字符数据时(使用您对有效性的定义),我必须先进行字节交换,然后才能理解数据

现在,假设我想通过某种传输机制(文件、互联网等)将UTF-16发送到另一个程序/机器。但不管出于什么原因,我知道接收过程肯定会在一台小小的endian机器上运行

为了使UTF-16的传输方式符合您的想法,我现在必须对每个UTF-16代码单元进行字节交换,传输交换的数据,然后在目的地进行字节交换,然后才能理解

实际情况是:我不会那样做。我这样做绝对没有任何好处。最重要的是。。。你不能强迫我那样做

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

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

请注意,此问题与更严格的数据格式不同。有一些二进制数据格式是显式的little-endian或big-endian。但一般来说,这些格式往往是严格指定的格式,必须符合一组严格的其他标准。通常会有一个一致性测试应用程序,您可以使用它来确保您的程序正确地生成文件,并且用错误的endian写入文件将立即被视为“不正确”


纯文本就是不能这样工作。没有人会通过识别器来识别文本文件,除非文本本身符合特定格式(此时,它不再是“纯文本”)。例如,XML可能要求UTF-16编码的文本文件符合特定的endian。但纯文本对此过于简单化;有太多的应用程序只想将UTF-16字符串转储到一个文件中,这样做才是现实的。

有二进制格式,允许使用小端和大端,必要时需要转换为其本机端