原帖发在 开源社区论坛上,感觉还有点意思,于是乎就搬到这儿来了咯~本帖探讨ASCII码编码中英文字母大小写编码的相关问题,不需要读者具有计算机编码方面的专业知识,当然咯,为了更好地参与讨论,一点点计算机编码的基本常识还是要有的。
不知ASCII码为何物的请先移步维基百科

故事的起源

Long long ago, 也就是上个学期微机原理课的时候,班上一MM问了老师这么一个问题——“ASCII码中大写字母A的十六进制代码是41,而小写字母的十六进制代码是61,中间不是只能编码20个字符么,那剩下的那6个大写字母跑哪去了呀?” 只见此时老师笑而不语(显然是男老师…),底下一小撮明白真相的群众疾呼:“那个41和61是十六进制呀!”

MM思维敏捷,很快又出现了新的问题:“41H和61H之间可以编码32个字符呀,那为什么小写字母不紧跟着大写字母编码呢?大小写字母连在一起多和谐呀~” 说时迟,那时快,老师答曰:“这个问题…我得先请示一下Google”。听MM刚才那么一说,52个大小写字母顿时哼起了:“让我们 握着手 手牵手 一起走到时间的尽头…” 但在得到美国国家标准化委员会的确切答复后,大A和小a只能率领50个兄弟姐妹以头跄地曰:“千杀的委员会!滥用手中的职权割断我们大写家族和小写家族之间的脐带!小心我叫老母亲来收拾你们!” 在这里我想为标准化委员会说几句话,人家帮你割断脐带是为了让小写家族得到新生呀!!欲知后事如何,且听下段分析。

分析

黑格尔在《法哲学原理》中曾提出这么一个观点:“存在即为合理”。假如这是对的,那么委员会采取不连续编码的方式编码52个大小写英文字母的合理性究竟体现在哪呢?

首先让我们看一下A-Z, a-z的十六进制编码,A-Z(41H-5AH), a-z(61H-7AH). 以A和a为例:

字符 十六进制 二进制
A 41 0100,0001
a 61 0110,0001

细心的你发现了什么?A和a之间的编码有哪些不同?仔细看看二进制那一栏,你发现了什么?

A和a的二进制表示形式仅第三位不同(从左至右数过去),大写为0,小写为1。自己试着写写B和b的二进制编码,发现什么规律?聪明的你应该全明白了,采取这种非连续的编码方式在兼顾线性编码(纯属个人YY,比如可以用A的十六进制代码加上20H可得到a)的同时考虑了大小写的转换问题,使得计算机在进行大小写转换的时候变得轻而易举,效率也比较高,试想大小写转换只需变动一位的位操作是不是比经过加法运算后的操作要简单呢?

结论

标准委员会的方案是对的,52个大小写字母在各自的地盘上安居乐业,再也没去请过他们的老母亲了(救人一命,胜造七级浮屠呀,^_^!) 习惯性地接受既有规定而不假思索是可怕的,它正在一点点蚕食着人类的创造力和想象力,假如今后出现了更利于实际计算的3进制4进制,甚至可实际使用的量子计算机,很多规则都将改变,只有明白其存在的合理性(或言之为缘由),我们才能对它进行更好地创造和利用,取得更为长远的发展。

求助

  1. 经初步查询,ASCII码是由美国国家标准委员会规定的,那么它与现在的ANSI(美国国家标准学会)有什么区别呢?似乎在网上没有这方面的说明
  2. 各位对ASCII码对大小写字母的编码方案是否有其它更合理的解释?一起探讨下吧。