字符串中不存在大端和小端?

3
我们知道,不同的字节序机器在内存中存储对象的顺序从最不重要的字节到最重要的字节有序,而其他机器则从最重要的字节到最不重要的字节存储。例如:一个十六进制值为0x01234567。

enter image description here

如果我们编写一个打印内存地址中每个字节的C程序,大端和小端机器会产生不同的结果。

但对于字符串,只要使用ASCII作为字符代码,任何系统都可以获得相同的结果,独立于字节顺序和字大小约定。因此,文本数据比二进制数据更具平台无关性。

所以我的问题是,为什么我们针对二进制数据区分大端和小端,我们可以使其与文本数据一样平台无关。在二进制数据中制造大端和小端机器有什么意义?


1
因为对于ASCII文本来说,没有排序的可能性。每个值都适合一个字节。一个字节总是按照正确的顺序排列。 - pmg
3
现在已经没有人再使用ASCII编码(或者更确切地说是:不应该再使用ASCII编码),UTF-8已成为首选编码方式(如果不是占据主导地位),而UTF-8和UTF-16都是多字节编码系统。需要注意的是,UTF-16对大小端序敏感,但UTF-8则不敏感(这是因为UTF-16需要解决从UCS-2继承来的设计错误所致的历史遗留问题)。 - Dai
6
Unicode 基本上是以 ASCII 为基础的!当您拥有一段英文文本时,其 UTF-8、ASCII 和 ISO-8859-1 编码是相同的。因此,英语使用者如果不想使用 ASCII,就不能使用 UTF-8!UTF-16 和 UTF-32 是端序敏感的,这并不是因为 Windows UCS-2 的继承,而是因为字符由 16 或 32 位值表示,这些值按定义是端序敏感的。UTF-8 不是端序敏感的,因为它只是一个字节序列。 - Serge Ballesta
2
@Dai:UTF-16不是一种多字节编码。每个字符都被编码为一个或多个16位值(int16_tuint16_t C类型)。而且,16位类型对字节序敏感。 - Serge Ballesta
4
“没人再使用 ASCII 了。”嗨,我的名字是 NoOne。 - Roberto Caboni
显示剩余12条评论
2个回答

6

数组元素总是按照从低到高的顺序进行寻址,无论大小端约定如何。

ASCII和UTF-8字符串是由char组成的数组,这不是多字节类型,也不会受到大小端约定的影响。

“宽”字符串,每个字符由wchar_t或其他多字节类型表示,将受到影响,但仅限于单个元素,而不是整个字符串。


索引未被访问。索引的“访问方式”由实现定义。 - 0___________
@P__J__: 高索引处的元素具有较高的地址。 - John Bode

2
我的问题是,为什么我们要针对二进制数据区分大端和小端,我们可以将其与文本数据一样成为平台无关的。为什么要在二进制数据中制造大端和小端机器?
简而言之:我们已经这样做了:例如,文件格式规范将指定32位整数应以大端或小端顺序序列化。同样,网络协议将指定多字节值的字节顺序(这就是为什么htons是必要的)。
但是,如果我们只关心二进制数据的内存表示(而不是序列化的二进制数据),那么使用最快的表示方式才有意义-即通过使用CPU和ISA本地首选的字节顺序来存储值。对于x86和x64,这是小端,但对于ARM、MIPS、68k等,首选顺序是大端(尽管大多数非x86 ISA现在都支持大端和小端模式)。
“但对于字符串来说,在使用ASCII作为字符编码的任何系统上都会得到相同的结果,与字节顺序和字长约定无关。因此,文本数据比二进制数据更具平台独立性。”我的问题是,既然文本数据可以实现平台独立性,为什么我们还要区分大端和小端呢?难道不能像文本数据一样让它们也实现平台独立性吗?简而言之,ASCII字符串不是整数,整数也不是ASCII字符串。
你基本上在问为什么我们不用大端模式表示十进制整数:因为十进制对于数字电脑来说很难处理(数字电脑使用二进制)。我们最接近你所描述的东西是 二进制编码的十进制,今天的计算机之所以不通常使用它,是因为它很慢且效率低下(因为只需要4位就能表示二进制中的一个十进制值 - 你可以将两个十进制值“打包”到一个字节中,但这可能会很慢,因为CPU通常在字大小(至少是字节大小)的值上运行得最快 - 而不是半字节大小的值 - 实际上,这仍然无法解决大端和小端问题(因为BCD值仍然可以使用BE或LE顺序表示 - 甚至基于char的字符串也可以反向存储而不影响它们的处理方式!)。

1
现代软件不使用ASCII,而是使用UTF-8,UTF-8是一种多字节编码。这个说法显然是错误的。C字符串字符始终是CHAR_BITS宽度。 - 0___________
1
@P__J__ 我使用术语“多字节编码”来描述UTF-8可能需要多达4个字节(即多个字节)来表示一个单一代码点的事实。你更喜欢我使用术语“可变字节长度编码”吗? - Dai
他正在询问关于C字符串的问题。在C语言中没有多字节字符。 - 0___________
1
@P__J__ 我理解原帖问题中对C字符串的提及只是作为一个例子,而不仅仅是关于C语言的问题。 - Dai
2
@P__J__,即使已经过时的C11也承认多字节字符的存在以及它们可能出现在普通的C字符串中。规范并没有强制要求任何特定的细节,但显然C语言在这个意义上有多字节字符。还不算C11中的UTF-8字符串字面量、宽字符和字符串,或者多字节整数字符常量。我不认为“C语言中没有多字节字符”是一个站得住脚的观点。 - John Bollinger

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接