ASCII码的排序背后有啥逻辑吗?

Posted

技术标签:

【中文标题】ASCII码的排序背后有啥逻辑吗?【英文标题】:Is there any logic behind ASCII codes' ordering?ASCII码的排序背后有什么逻辑吗? 【发布时间】:2010-11-11 07:00:03 【问题描述】:

我正在教我学习工程学的弟弟 C。我在向他解释不同的数据类型是如何实际存储在内存中的。我向他解释了有符号/无符号数字和十进制浮点位背后的逻辑。当我告诉他 C 中的 char 类型时,我还带他了解了 ASCII 码系统以及 char 是如何存储为 1 字节数的。

他问我为什么“A”被赋予了 ASCII 码 65 而没有其他任何东西?同样,为什么“a”被​​指定为代码 97?为什么大写字母和小写字母的范围之间有6个ASCII码的差距?我对此一无所知。你能帮我理解一下吗,因为这也让我产生了极大的好奇心。到目前为止,我从未找到任何讨论过这个主题的书。

这背后的原因是什么? ASCII 代码是否有逻辑组织?

【问题讨论】:

虽然以非技术性的方式谈论浮点数和小数是很好的,但野外的大多数浮点数都是二进制浮点数,而不是十进制浮点数,这是很多浮点数的来源程序员的困惑。这有点像教导太阳绕地球运行 - 孩子们可以理解白天和黑夜,但对于崭露头角的火箭科学家来说却很困惑。 相关:Things Every Hacker Once Knew(关于ASCII及相关技术) 间隙是将上下字母相对于%32边界以相同的方式对齐,使这项工作:What is the idea behind ^= 32, that converts lowercase letters to upper and vice versa? 【参考方案1】:

这张图表很好地显示了***:注意控制 2 的上部 2 和下部的两列,然后用 misc 填充间隙。

还请记住,ASCII 是根据之前的内容开发的。有关 ASCII 历史的更多详细信息,请参阅this superb article by Tom Jennings,其中还包括一些陌生控制字符的含义和用法。

【讨论】:

链接好像坏了。 worldpowersystems.com/ARCHIVE/historyOfCharacterCodes/…【参考方案2】:

有历史原因,主要是为了方便ASCII码转换:

数字(0x30 到 0x39)的二进制前缀为 110000:

0 is 110000
1 is 110001
2 is 110010

等等。 所以如果你去掉前缀(前两个 '1'),你最终会得到二进制编码的十进制数字。

大写字母有二进制前缀1000000:

A is 1000001
B is 1000010
C is 1000011

等等。 同样的,如果你去掉前缀(第一个'1'),你最终会得到字母索引字符(A 是 1,Z 是 26,等等)。

小写字母有二进制前缀1100000:

a is 1100001
b is 1100010
c is 1100011

等等。 和上面一样。因此,如果您将 32 (100000) 添加到大写字母,则您将得到小写版本。

【讨论】:

买为什么'A'是65而不是64?任何编码都有一定程度的逻辑性和一定程度的任意性。 @JimBalter 因为他们希望字母表被 1 索引。 1 是 A,26​​ 是 Z。 @NathanLong 没有理由想要这样做,也没有证据证明这是真的。并且 65 不是 1。从字母中减去 63 将产生 1 索引。 @JimBalter 抱歉,我应该打一个问号 - “因为他们希望字母表是 1 索引的?”我在猜测。至于 65 为 1,此答案显示“大写字母具有二进制前缀 1000000”,即 64。因此,如果删除该前缀(减去 64),则 A 为 01(1),B 为 10(2)等.【参考方案3】:

这里有非常详细的 ASCII 码历史和描述:http://en.wikipedia.org/wiki/ASCII 简而言之:

ASCII 基于电传打印机编码标准 前 30 个字符是“不可打印的” - 用于文本格式 然后它们继续使用可打印字符,大致按照它们在键盘上的排列顺序。检查你的键盘: 空间, 数字大写的大写符号:!、"、#、...、 数字 符号通常放置在带有数字的键盘行末尾 - 大写 大写字母,按字母顺序排列 符号通常放置在带有字母的键盘行末尾 - 大写 小写字母,按字母顺序排列 符号通常放置在带有字母的键盘行末尾 - 小写

【讨论】:

一些较旧的键盘(我知道 Atari 800 就是其中之一)在 2 键上有 " 字符,因此编码和键盘顺序之间的对应关系更密切。 @dan04 这很有趣。即使在今天,英式键盘的 2 键上也有 " 字符。打字机也是 IIRC。【参考方案4】:

Wikipedia:

代码本身的结构使得 大多数控制代码都在一起,并且 所有图形代码都在一起。这 前两列(32 个位置)是 为控制字符保留。[14] “空间”角色必须来 在图形进行排序之前 算法简单,所以它变成了位置 0x20.[15]委员会决定是 支持大写很重要 64 个字符的字母,并选择 结构 ASCII 所以它可以很容易地 减少到可用的 64 个字符集 图形代码。 [16]小写 因此字母没有交错 大写。保持选项打开 对于小写字母和其他 图形,特殊和数字 代码放在字母之前, 并且字母“A”被放置在 位置 0x41 以匹配草稿 对应的英国人 标准。[17]数字 0-9 是 放置使它们对应于中的值 以 011 为前缀的二进制,使得 用二进制编码的十进制转换 直截了当。

【讨论】:

【参考方案5】: 'A' 是十六进制的 0x41。 'a' 是十六进制的 0x61。 “0”到“9”是十六进制的 0x30 - 0x39。

所以至少很容易记住Aa0-9 的数字。我对符号一无所知。见The Wikipedia article on ASCII Ordering。

【讨论】:

【参考方案6】:

如果您查看“a”和“A”的二进制表示,您会发现它们仅相差 1 位,这非常有用(将大写字母转换为小写字母或反之亦然翻转一点)。为什么要专门从那里开始,我不知道。

【讨论】:

【参考方案7】:

Aa 之间的距离是 32。这是个整数,不是吗?

大写字母和小写字母之间有6个字符的差距是因为(32 - 26) = 6。(注:英文字母共有26个字母)。

【讨论】:

如果您对借来的词做出幼稚的假设,那么英文字母表有 26 个字符。 其实 ï 和 i 是同一个字母,但带有一个变音符号。虽然英语借了很多词,但我不认为它借用了像þ(冰岛语)或IJ(荷兰语)这样的字母。 看看这个,en.wikipedia.org/wiki/Thorn_(letter),@MSalters。 þ 是写“th”音素的旧方法。另请查看en.wikipedia.org/wiki/Ye_olde。 不仅如此,字母不跨越 mod-32 边界,因此您可以切换单个位来翻转大小写,而不必实际添加或减去(使用进位传播)去一种或另一种方式。 What is the idea behind ^= 32, that converts lowercase letters to upper and vice versa?

以上是关于ASCII码的排序背后有啥逻辑吗?的主要内容,如果未能解决你的问题,请参考以下文章

BCD码和二进制码有啥区别

按照ASCII码升序排序问题,我哪里不对呀?

BCD码和二进制码有啥区别

ASCII码与BCD码的区别

c语言字符与ASCII码的转换

如何用C语言输出26个英文字母和其ascii码的对照表