字符编码之Ascll编码,ANSI编码,Unicode编码,UTF-8编码 ,BOM

从大一上C语言就开始认识了Ascll编码,ascll码也算是我们最早所接触的编码

【1】Ascll码

 Ascll码由三部分组成:

          第一部分从00H到1FH共32个,一般用来通信或作为开工至之用,有的可以显示在屏幕上,有的则无法再屏幕上显示。

          第二部分从20H到7FH共96个,除了32H的空格之外,其余的95个字符用来表示阿拉伯数字,英文字母大小写和底线,括号等其他符号。这里需要记一下日常经常用到的:0是048号,A是065号,a是097号。

          第三部分从80H到0FFH共128个字符,一般称为扩充字符,zhe128个字符是由IBM指定的,并非标准的ASCLL码,用来表示框线,音标和其它欧洲非英语系的字符。

接下来附上百度找的一张Ascll码表:

【2】ANSI

首先要说的是在不同的系统下ANSI表示不同的编码值。为什么呢?

            因为不同的国家和地区对ANCI编码指定了不同的标准,由此产生了比如GB2312,GBK,Big5,shift_jis等不同的编码标准,称这些使用1至4个字节来代表一个字符的各种字符延伸的编码方式为ANSI编码。而这些ANSI码之间是互不兼容的,因此会导致不同语言的文本中会出现乱码。

            ANSI编码用的是0x00~0x7f范围的1个字节来表示一个英文字符,也就是说ANSI码仅在前126个与ASCLL码相同(所以ANSI可以理解为是Ascll码的一种扩展),其他超出此范围的0x80~0xFFFF用多个字节来表示一个字符,用来表示其他语言的其他字符(要表示不同国家那么多语言,这些编码肯定是不足够的,因此只能表示一部分).

            如果你要解码一份文件(如果是ANSI编码文件的话),不仅要知道它是ANSI编码,还要知道它是哪个国家的,才能解码。

            记事本默认以ANCI编码保存文本文档。(记事本有四种编码方式:UTF-8,ANSI,Unicode,Unicode big endian)

【3】Unicode(万国码)

         由此,为了解决不同语言的编码乱码问题,出现了Unicode(UCS).

           所以说Unicode是在ANSI之后出现的由国际组织设计,可以容纳全世界所有的语音文字的编码方案。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,来实现不同语言,不同国家直接对字符的转换和处理。

             Unicode通常用两个字节来表示一个字符,(生僻字可能会用四个字节)原来ANSI里用一个字节来表示英文编码在Unicode里变成了用两个字节编码。

             Unicode编码的缺点就是浪费空间,比如在ANSI前英文字符集里只用一个字节就可以表示,可是在Unicode编码中就需要用两个字节,造成了空间浪费(高字节位补0)

【4】UTF-8

       那Unicode编码也有缺点,这可如何是好?此时UTF-8编码就产生啦!!!

           UTF-8编码最大的特点就是可变长编码:它根据不同的字符来改变字节长度,比如ascll码范围时用一个字节表示(保留了ascll码的编码方式),Unicode中中文字符占两个字节,而在UTF-8中占3个字节,而且Unicode和UTF-8之间需要通过一系列的算法和规则来进行转换并非直接转换。

         计算机内存中统一使用Unicode编码

         数据传输的时候使用的是UTF-8编码方式

         文件存储的时候由UTF-8转成Unicode编码放入内存,读取时有Unicode再转成UTF-8

         网页使用的统一编码UTF-8编码

在这个时候小北同学就很好奇了,那如何解析一个中文文本文件嘞?中文那么多编码格式,计算机如何判断它用的是哪种编码方式写的嘞?

这个时候我发现了一个好东东!!!哈哈哈哈哈哈哈哈嗝

          BOM,BOM就是byte order Mark ,一般呢为了方便解析中文文件,它的文件头都会加一个编码格式标识就是BOM,不同的编码方式对应的BOM是不同的。

比如:UTF-8是0xEF BB BF

UTF-16(BE):0xFE FF

UTF-16(LE):0xFF FE

上面的BE和LE表示它存储的时候用的是大端或者小端模式,指的是CPU处理多字节数的不同方式。

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章