Ascii趣事

来源:互联网 发布:racemenu男性捏脸数据 编辑:程序博客网 时间:2024/04/29 19:06
    最近在慢慢的看一些guava的源代码,发现一段跟ascii相关的代码,结合一段历史来看很有意思。
    guava代码中有Ascii这个类,定义了Ascii中部分字符的常量,目的嘛。。都是byte的常量,难道是省空间,Orz。直接说重点,里面定义touppercase和tolowercase方法,指明只对ascii码中的大小写进行转换,其实也就是对英文字母的转换,这与String里的方法是有区别的,因为String里面的case转换是基于unicode字符集的,显然大部分情况下,我们只需要对英文字母做大小写的转换,于是String toxxcase里面的一大坨代码需要考虑的locale,对不同字符的大小写转换码表,大量的位运算,还有很多判断逻辑都是浮云,代码很多余。Ascii里的代码很简单,只是使用位运算来处理英文字母的大小写转换,因为大小写相差刚刚32,unicode码里面有各种字符之间转换的码表,而ascii转换码表很简单,+-32即可,所以使用0x5f和0x20来做位运算就可以进行转换了,一个小的改进带来的价值有多大。。如果你有几百台机器在做大小写不敏感的字符串匹配和分析,这个改进的价值几何呢?我不清楚,也许google能给个答案。
    32,这个数字很凑巧,刚好可以使用位运算来对大小写进行转换,其实是在1963年一次投票后Ascii码中大小写才改进为相差32:
The X3.2.4 task group voted its approval for the change to ASCII at its May 1963 meeting.Locating the lowercase letters in columns 6 and 7 caused the characters to differ in bit pattern from the upper case by a single bit, which simplified case-insensitive character matching and the construction of keyboards and printers.
  很多时候我们需要了解更多的计算机发展历史才能明白更多东西,只是我们有多少时间专门来做这件事呢,还得平时多留心啊!