字符编码小评

10年前
字节(Byte)
    字节是通过网络传输信息(或在硬盘或内存中存储信息)的单位。
    1个字节等于8位二进制 : 1 Byte = 8 bit (比特)或这样理解:1字节(Byte)= 8位(bit)1千字节(KB,Kilobyte)=1024字节(2的10次方字节)( 1KB = 1024 B )


字符 
    人们使用的记号,抽象意义上的一个符号。 '1', '中', 'a', '$', '¥', ……
           字节 计算机中存储数据的单元,一个8位的二进制数,是一个很具体的存储空间。0x01, 0x45, 0xFA, ……英文一个字母是一字节。中国字比较复杂,1字节=8位,8位从0000 0000到1111 1111,即2的8次方只能表示256个字符,2个字节是2*8=16位,从0000 0000 0000 0000 到 1111 1111 1111 1111可以表示65535个字符。


编码方式    
    Unicode 和 ANSI 是两种常见的编码方式。

    ANSI 编码方式
    在 ANSI 编码的定义中,存在不同的字符集(Charset)的概念。

    同样的字节序列,在不同的字符集下表示的字符不一样。 要正确解析一个ANSI字符串,还要选择正确的字符集,否则就可能导致所谓的乱码现象。

    不同语言版本的操作系统(如日文版Window7、韩文版Windows7等),都有一个默认的字符集。在不指定字符集的情况下,系统会使用此字符集来解析 ANSI 字符串。也就是说,如果我们在简体中文版的Windows下打开了一个由日文操作系统保存的 ANSI 文本文件(仅包含 ANSI 字符串的文本文件),我们看到的将是乱码。

    ANSI 字符串 :在一个字符串中,可以用一个字节也可以用2个字节。 在内存中,如果“字符”是以ANSI编码形式存在的,一个字符可能使用 一个字节或多个字节 来表示那么我们 称这种字符串为 ANSI 字符串或者多字节字符串。如,"中文123" (占7字节)。


    Unicode 编码方式
    在 Unicode 编码的定义中不存在字符集的概念。

    字符串 在内存中,如果“字符”是以在Unicode中的序号存在的,那么我们称这种字符串为Unicode字符串或者 宽字节字符串  在Unicode中,每个字符都 占两个字节 。如,"中文123"(占10字节)。Unicode和ANSI的区别就相当于输入法内的“全角” 和 “半角”的区别。

    由于不同 ANSI 编码所规定的标准是不相同的(字符集不同),因此,对于一个给定的多字节字符串,我们必须知道它采用 的是哪一种字符集则,才能够知道它包含了哪些“字符”。而对于 Unicode 字符串来说,不管在什么环境下,它所代表的“字符”内容总是不变的。Unicode 有着统一的标准,它定义了世界上绝大多数的字符的编码,使得拉丁文、数字、简体中文、繁体中文、 日文都能一同一种编码方式保存。


字符集

    字符集英文:Charset。        

    每个字符集都有一个唯一的编号,称为代码页(Code Page)。简体中文(GB2312)的代码页为936,而系统默认字符集的代码页为0,它表示根据系统的语言设置来选择一个合适的字符集。