计算机编码--2.ASCII与ANSI、ASCII扩展与IOS-8859-1

本来想把所有编码写在一起的,无奈每一种编码的知识其实都蛮多的,并且越往后面你的越多,分开写。

编码与解码:

狭义的:
我们要和计算机打交道,必须把人类社会的语言符号和机器中的语言(01)对应起来。将人类设备的语言转变为计算机语言的过程叫做编码,反过来叫做解码。
广义的:
在不同的表达格式上进行的转换,向“自身表达格式”转换的过程称为解码,向"对端表达格式"转换的过程称为编码。

标准ASCII

1个bit位,只能表示0或者1,也就是2^1=2个信息,想表示更多的信息,必须使用多位的组合来实现。当时编码的发明者,遍历英语体系中可能出现的字符,也就是我们键盘上能看到的大概内容,包括:26个字母,大小写一共52个,加上0-9,10个阿拉伯数字,加上+-*/( )等常用符号,再加上33个控制字符,一共总结出了有127个,为了防止将来可能再有增加,多给了一位数。这就是ASCII码(American Standard Code for Information Interchange 美国信息交换标准代码),这个II是后两个单词的缩写,我一开始一直以为是拉丁文的序号,以为是第二版的ASC编码。。。
标准的ASCII,多给的第一位数默认为0。

控制字符

ASCII码中,除了真正的表意字符,还有33个“控制字符”。
具体的百度一下,只说一下我接触到控制字符的一种情况。

控制机器是给机器用的指令标识,并不表达文本方面的意思,是非打印字符,在文本编辑工具里面看不到,或者是一个小”口“。

因为有了这样的特性,可以作为文字分隔符来使用。可以为文件中做文字分隔符,也可以在流的传输中,做为一段信息的分隔符。

我之前的公司有把ASCII这些控制字符作为导出导入文件的文字分隔符的,因为不会和正常字符冲突,是一种不错的思路。

然后我们使用kettle来进行文件导入,kettle的任务文件是xml的。
在xml1.0规范里,是不认识ascii中的控制字符的,会报错。xml1.1规范是可以包括ASCII的控制字符的,每次生成xml之后,统一将xml的version,改成xml1.1就可以了。

还有有个项目,用来在Socket传递的消息中,标记一段信息是否结束,以及标记里面的内容如何分段。


扩展的ASCII

其实标准的ASCII就是7-bit的编码(8字节,但是最高位没有编码),后来使用过程中发现127个字符有点不够用,于是将ASCII进行了扩展,叫做Extended-ASCII或者high-ASCII,8位的,能表示256个字符。由于不同的应用场景,有不同的编码,有IBM的Extend ASCII和ANSI的Extend ASCII。去wikipedia上会发现有好多种ASCII的标准,大类就是IBM和ANSI(Windows的,微软很强势,ANSI的东西感觉就是给他们家用的)两种,其实都是为了给自家系统用的,随着IBM操作系统的坠落,IBM的扩展ASCII也基本上淡出视野。
wikipedia:
Revisions of the ASCII standard:
  • ASA X3.4-1963[1][4][16][17]
  • ASA X3.4-1965 (approved, but not published, nevertheless used by IBM 2260 & 2265 Display Stations and IBM 2848 Display Control)[1]:423, 425–428, 435–439[16][17]
  • USAS X3.4-1967[1][5][17]
  • USAS X3.4-1968[1][17]
  • ANSI X3.4-1977[17]
  • ANSI X3.4-1986[7][17]
  • ANSI X3.4-1986 (R1992)
  • ANSI X3.4-1986 (R1997)
  • ANSI INCITS 4-1986 (R2002)[18]
  • ANSI INCITS 4-1986 (R2007)[19]
  • ANSI INCITS 4-1986 (R2012)
看到没,早期有四个版本是IBM的

扩展的ASCII的产生

既然IBM的扩展ASCII已经成为昨日黄花,我们只考虑ANSI的扩展ASCII的出现契机。
搭载Windows系统的计算机进入欧洲之后,发现标准的ASCII并不能满足欧洲这些拉丁语族国家的语言表意,决定对其进行扩展。同为印欧语系,发现扩展起来也没那么难,总共256个值就包括所有了。只需要将原来的7-bit扩展为8-bit,将原来的标准ASCII保留,第一位使用0来表示。将扩展的字符第一位使用1来表示。

IOS-8859-1

这个编码向下兼容ASCII,但是已经不是标准的ASCII了,因为不能互相转换(只能单向转换),它有新的名字。这个编码是在Windows(绑架ANSI)进入欧洲(ISO组织可能老巢在欧洲)时候一起搞出来的,标准编号叫做ANSI/ISO-8859-1-1987,简称ISO-8859-1。编码全称叫做「American National Standard for Information Processing-8-Bit Single-Byte Coded Graphic Character Sets-Part 1: Latin Alphabet No 1」,所以也简写作Latin-1,mysql设置的时候就会设置成latin1
因为拉丁语系的国家太多,欧洲这片大陆也是动乱不安,ISO-8859-1一个是不够的,根据不同的地方,搞出了很多ISO-8859系的标准,具体可以见百度百科,从1到16。。。
我们常用的是IOS-8859-1,叫做“西欧字符集”。
由于这个字符集包括了印欧语系,也就是当今世界大部分技术、开发工具发源地。。很多语言标准、开发工具的编码格式默认是IOS-8859-1,这也是中文乱码的一个坑。

ANSI编码?

我们在windows下打开记事本,然后随便输入点内容,点击保存的时候,会有ANSI的选项,这是什么鬼,有的地方管这个叫做ANSI编码。


事实上并没有ANSI编码,ANSI是什么,是American National Standards Institute美国国家标准协会,协会,机构而已。
ANSI也有自己的ASCII标准。但是我们看到的这个ANSI并不是特指ANSI的ASCII标准,这个应该指所有的本地化编码。
这个是微软的锅。一开始只有英文操作系统,用ANSI表示ANSI的Extend ASCII编码。但是到了欧洲就是ISO-8859-1编码,到中国应该是GBK编码,日本应该是JIS编码等等,为了把实际编码的差异隐藏起来,用所谓的ANSI编码来表示所有Windows系统上的地区化编码,然后操作系统自己做转换,不同的国家地区,就会对应不同的编码规范。
ANSI应该叫地区化编码,只出现在Windows系统中,就好像一种工厂模式,被Windows系统用来统一地区化编码的叫法。


再多说一点,下面的Unicode其实是UTF-16,或者说是UTF-16LE,Unicde big endian是UTF-16BE,UTF-8,就是UTF-8。这四个选项就能囊括所有的主流编码了,被归为这四种是有历史原因的。如果对这句话不明白,请看我的博客编码系列的其它文章,看完就明白了。

猜你喜欢

转载自blog.csdn.net/u011531425/article/details/80951786