常见的几种编码方式

  Nodepad++相信大家都有用过,格式那一栏有ANSI格式编码,UTF-8格式编码,UTF-8无BOM格式编码,UCS-2 Big Endian以及UCS-2 Little Endian,这些其实就是我们常说的编码方式。你可能会想问为什么没有ASCII,Unicode,UTF-16呢,因为你肯定在写程序的时候用过,后面我们会说到这种可以说是广为流传的误区吧。


 以上提到的Notepad++中出现的,被称之为格式编码。那么什么是编码呢,图片的jpg,视屏的AVI都是编码方式,我们可以猜到这里面涉及到存储的概念,转换的概念。那么我们今天所讨论的编码可以看做是字符的编码,同样会涉及到存储和转换的内容。所谓的存储就是,每个字符用几个字节来表示以及是大头方式还是小头方式,转换就是将该字符映射成为对应的数字,毕竟计算机只能理解0,1代码,即高低电平。


  下面我们分别看一下我们经常遇到的几种情况。

 
  ASCII应该是最熟悉的,使用了8位的二进制来表示英文的字母和字符,比如0x20表示空格;0x30表示数字0;0x61表示字母a等等。当然最开始的时候最高位全是0,后来扩展后的ASCII使用到了最高位为1的情况。
 
  ANSI是在ASCII的8位用尽的情况下,出现的一种解决方案。我大汉民族常用汉字6000+,所有的字符好几万,那就用16位表示;我们还有55个兄弟姐妹呢,那就用32 位表示。我理解的ANSI就是一个统称,在我们中文环境就是GB2312,在日本人的环境就是相应的日本人制定的编码。
 
  ANSI编码虽然解决了ASCII长度不足的问题,但是不同的ANSI编码不能够兼容。我们知道网络的发展极大地促进了各国之间的交流,而这种不兼容的情况是不能忍的。于是催生出了Unicode。
 
  准确的说Unicode并不是一种编码方式,它是一个字符集,包括了全世界绝大多数文明的字符,而且还在不断的发展之中,毕竟人类的创造力是无限的。Unicode定义了字符到数字的映射关系。比如字符“中”对应的数字十六进制为4E2D。UNICODE并没有规定要用用多少个字节表示字符,因为这是编码的范畴,字符集并不管。
 
  UTF-8 (Unicode Transformation Format)就是Unicode的一种实现。作为一种编码方式,我们前面提到过。其表示采用变长字节进行存储,比如英文字符就是用一个字节就行,对于汉字使用3个字节,按需使用。对于转换,我们知道Uincode定义了数字跟相应字符的映射,比如“中”Unicode为4E2D,UTF-8编码为E4B8AD。怎么转化为3个字节的形式就是UTF-8的具体实现,可以去查一下。
 
  虽然有了UTF-8,但有些强迫症患者看着这种不规则存储实在是心里难受,所以同时也制定了UTF-16,常用的字符都用16位表示,这样看着就舒心多了。当然不常用的字符使用32位来表示。UTF-16BOM表示的是字节序,与后面所述的大小头是一个意思。这里面用于网络传输。
 
  UCS-2是Universal Character Set缩写,其和UTF-16基本一样,就是只是用16位表示字符,当然其支持字符集就不如UTF-16广泛了。至于大小头方式,举个例子字符“中”Unicode为4E2D,使用UCS-2 Big Endian表示为4E 2D,使用UCS-2Little Endian表示为2D 4E。大小头用于实际的存储。
 
  每一种编码方式都会有其历史背景以及优缺点,就不一一讲述了。以上就是我对几种常见的编码格式等的理解,如有错误,请指正。

 

    原文作者:村中少年
    原文地址: https://blog.csdn.net/javajiawei/article/details/51331404
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞