再理解Unicode

1. Unicode,UCS-2, UCS-4, UTF-8, UTF-16, UTF-32
--字节和字符的区别。一个字符可以用多个字节来存储表达。
--Big Endian和Little Endian

上面提到了一个字符可能占用多个字节,那么这多个字节在计算机中如何存储呢? 比如字符0xabcd,它的存储格式到底是 AB CD,还是 CD AB 呢?

实际上两者都有可能,并分别有不同的名字。如果存储为 AB CD,则称为Big Endian; 如果存储为 CD AB,则称为Little Endian

具体来说,以下这种存储格式为Big Endian,因为值(0xabcd)的高位(0xab)存储在前面:

地址
0x00000000AB
0x00000001CD

相反,以下这种存储格式为Little Endian:

地址
0x00000000CD
0x00000001AB
--Unicode:Unicode defines a huge character set, assigning one unique integer value to every graphical symbol. UTF8/16/32 are simply different ways to encode this.Unicode是为整合全世界的所有语言文字而诞生的。任何文字在Unicode中都对应一个值,这个值称为代码点(code point)。代码点的值通常写成 U+ABCD 的格式。
--UCS-2/UCS-4:文字和代码点之间的对应关系就是UCS-2(Universal Character Set coded in 2 octets)。顾名思义,UCS-2是用两个字节来表示代码点,其取值范围为 U+0000~U+FFFF。为了能表示更多的文字,人们又提出了UCS-4,即用四个字节表示代码点。它的范围为 U+00000000~U+7FFFFFFF,其中 U+00000000~U+0000FFFF和UCS-2是一样的。要注意,UCS-2和UCS-4只规定了代码点和文字之间的对应关系,并没有规定代码点在计算机中如何存储。规定存储方式的称为UTF(Unicode Transformation Format)
--UTF-8/16/32:三种Unicode编码方式。
  UTF8:variable,1-4个字节表示
  UTF16:variable, 2-4个字节表示
  UTF32:fixed size,4个字节。
--Windows上Unicode是UTF-16 little endian编码;LInux上Unicode是UTF8编码。
--考虑到最初的目的,通常说的Unicode就是指UTF-16
2. Why Unicode?
在Unicode出现之前,各种语言字符的编码存储是通过Code Page的方式来实现的。即不同的语言,制定自己的字符集,用Code Page自己的编码方式来表达其字符集中的每个字符。其编码解码需要安装对应Code Page。比如:如果一段中文是GB2312编码的,保存在a.txt中,然后copy到了另一台电脑上。为了能正确显示这段文字,必须在目标机器上安装相应的Code Page并指定为non-Unicode program的默认Code Page。

参考:Unicode详解    (http://tech.idv2.com/2008/02/21/unicode-intro/)
原文地址:https://www.cnblogs.com/taoxu0903/p/2093644.html