在计算机中,无论是字符串、float、double或有符号整型,在存储和运算时都要使用二进制表示(因为计算机用高电平和低电平分别表示1和0)。可以用某固定长度的比特位代表不同的符号(英语字母、汉字或是简单的图形符号);具体用哪个二进制数字表示哪个符号,当然每个人都可以约定自己的一套(这就叫编码),自己使用是没关系的,而如果要想互相通信而不造成混乱,几乎不能通讯,或代码的移植。那么大家就必须使用相同的编码规则,于是美国有关的标准化组织就出台了所谓的ACSII,统一规定了上述常用符号用哪些二进制数来表示。
Ascii是American Standarded Code Informatin Interchange的简称, 是单字节的编码,只有256个字符(可见字符和不可见的控制字符),而日常使用字符远远超过这个数目,所以你见不着ascii的存储方式,不过基本所有编码方式都镶嵌了ascii的编码。
如上所述,如果用一个字节表示一个字符,一般对英文(26个字母的大小写)是没问题的,然而对于中文或其他西欧国家的语言是远远不够的。 当然了,只使用ASCII表只能表示汉字的冰山一角,怎么办?于是我们发明了GB2312编码,此编码完全忽略了ASCII表中 127位后面的内容,127位前面的内容(包括各种标点符号和字母大小写,详见http://www.asciitable.com/)保留。只能增加字节数来扩充字符的容量,两个字节怎么样呢?如果两个字节同时大于127(7F)就认为这两个字节表示一个汉字,同时像标点、字母也都重新使用两个字节 定义了一遍,这就是我们经常说的 全角,这种方案可以表示6000种文字。但是我们的汉字还是太复杂了,6000个字也不够用,于是我们开始对GB2312进行 扩展 ,规定只要一个字节大于127,这个字节和后面的字节组合起来就代表一个汉字,这种编码成为GBK,于是又增加了20000多个汉字! 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030。从此之后,中华各个民族的文化就可以在计算机时代顺利地传承了。
这些使用 2 个字节来代表一个字符的各种符号(中文、韩文或日文等等)延伸编码方式,称为 ANSI 编码,ANSI码(American National Standards Institute),中文:美国国家标准学会的标准码。
为使计算机支持更多语言,更方便通讯交流,通常使用 0x80~0xFF 范围(也就是上面所说的大于十进制的127)的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。 对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表1个字符。这一点是ANSI编码与Unicode(UTF-16)编码的最大也最明显的区别。比如“A君是第131号”,在ANSI编码中,占用12个字节,而在Unicode(UTF-16)编码中,占用16个字节。因为A和1、3、1这4个字符,在ANSI编码中只各占1个字节,而在Unicode(UTF-16)编码中,是需要各占2个字节的。
上面的提到的Unicode编码是下次要介绍的一种编码方式或实现方式(具体异同见下文)。
另:vc6.0默认是ansi编码,而vs2005、vs2008、vs2010默认是unicode编码,他们之间的代码移植还是应该注意一下。
Ascii是American Standarded Code Informatin Interchange的简称, 是单字节的编码,只有256个字符(可见字符和不可见的控制字符),而日常使用字符远远超过这个数目,所以你见不着ascii的存储方式,不过基本所有编码方式都镶嵌了ascii的编码。
如上所述,如果用一个字节表示一个字符,一般对英文(26个字母的大小写)是没问题的,然而对于中文或其他西欧国家的语言是远远不够的。 当然了,只使用ASCII表只能表示汉字的冰山一角,怎么办?于是我们发明了GB2312编码,此编码完全忽略了ASCII表中 127位后面的内容,127位前面的内容(包括各种标点符号和字母大小写,详见http://www.asciitable.com/)保留。只能增加字节数来扩充字符的容量,两个字节怎么样呢?如果两个字节同时大于127(7F)就认为这两个字节表示一个汉字,同时像标点、字母也都重新使用两个字节 定义了一遍,这就是我们经常说的 全角,这种方案可以表示6000种文字。但是我们的汉字还是太复杂了,6000个字也不够用,于是我们开始对GB2312进行 扩展 ,规定只要一个字节大于127,这个字节和后面的字节组合起来就代表一个汉字,这种编码成为GBK,于是又增加了20000多个汉字! 后来少数民族也要用电脑了,于是我们再扩展,又加了几千个新的少数民族的字,GBK 扩成了 GB18030。从此之后,中华各个民族的文化就可以在计算机时代顺利地传承了。
这些使用 2 个字节来代表一个字符的各种符号(中文、韩文或日文等等)延伸编码方式,称为 ANSI 编码,ANSI码(American National Standards Institute),中文:美国国家标准学会的标准码。
为使计算机支持更多语言,更方便通讯交流,通常使用 0x80~0xFF 范围(也就是上面所说的大于十进制的127)的 2 个字节来表示 1 个字符。比如:汉字 '中' 在中文操作系统中,使用 [0xD6,0xD0] 这两个字节存储。 对于ANSI编码而言,0x00~0x7F之间的字符,依旧是1个字节代表1个字符。这一点是ANSI编码与Unicode(UTF-16)编码的最大也最明显的区别。比如“A君是第131号”,在ANSI编码中,占用12个字节,而在Unicode(UTF-16)编码中,占用16个字节。因为A和1、3、1这4个字符,在ANSI编码中只各占1个字节,而在Unicode(UTF-16)编码中,是需要各占2个字节的。
上面的提到的Unicode编码是下次要介绍的一种编码方式或实现方式(具体异同见下文)。
另:vc6.0默认是ansi编码,而vs2005、vs2008、vs2010默认是unicode编码,他们之间的代码移植还是应该注意一下。