目前计算机中用得最广泛的字符集及其编码,是由美国国家标准局(ANSI)制定的ASCII码(American Standard Code for Information Interchange,美国标准信息交换码),它已被国际标准化组织(ISO)定为国际标准,称为ISO 646标准。ASCII码适用于所有拉丁文字,它用7位二进制数进行编码(其最高位(bit7)被用做奇偶校验位),可以表示128个字符。
第0~32号及第127号(共34个)是控制字符或通信专用字符,如控制符:LF(换行)、CR(回车)、FF(换页)、DEL(删除)、BEL(振铃)等。
第33~126号(共94个)是字符,其中第48~57号为0~9 10个阿拉伯数字;65~90号为26个大写英文字母,97~122号为26个小写英文字母,其余为一些标点符号、运算符号等。
ASCII码占用一个字节,准确地说,是7个比特。由于汉字出现在ASCII码之后,所以汉字的编码必须兼容ASCII码。还有一个问题就是,汉字的数目很多,用简单的1个字节根本无法表达(1个字节,撑死了只能表示256个字符,除掉ASCII码,只有128个可用的了)。因此聪明的中国人决定采用2个字节来表达一个汉字。由于ASCII码占用7位的历史原因,所以这种聪明的编码方式规定:对于连续的2个字节,只有在2个字节的bit7都是1的情况下,才认为这2个字节合起来表示一个汉字。这样不同长度混排的编码方法,通常被叫做"MBCS(Muilti-Bytes Charecter Set,多字节字符集)",如"中文ABC"这串文本,它所占用的字节数可能就是:2×2+3=7,如图4-12所示。
ANSI、MBCS与UNICODE _编码 
图4-12  MBCS下中文与字
母的存储长度
这样的编码挺好,而且与ASCII码兼容。这种编码被称做GB2312(国标2312,GB就是国标的简写)。GB2312后来又扩展成了GBK(国标扩展码),甚至GB18030。此外,不同的国家和地区都制定了不同的编码标准,如:BIG5、JIS等编码。不同编码之间互不兼容,当信息在国际间交流时,无法将属于两种语言的文字存储在同一段编码的文本中,UNICODE由此浮出水面。
为了使国际间信息交流更加方便,国际标准化组织(ISO)制定了 UNICODE 字符集,为各种语言中的每一个字符设定了统一并且唯一的数字编号,以满足跨语言、跨平台进行文本转换、处理的要求。
UNICODE开始制订时,计算机的存储器容量极大地发展了,也就是说空间再也不成为问题了。于是ISO直接规定必须用2个字节,也就是16位来统一表示所有的字符,对于ASCII里的那些"半角"字符,UNICODE保持其原编码不变,只是将其长度由原来的8位扩展为16位,如英文字母"A",其编码就会变成"00000000 01100001"。很显然,由于"半角"英文符号只需要用到低8位,所以其高8位永远是0。因此这种大气的方案在保存纯英文文本时会浪费一倍的空间。而其他文化和语言的字符则全部重新统一编码。如:"中"的UNICODE为"01001110 00101101"。
这样一来,没那么多的麻烦事了,所有的字符都固定占用2个字节。如"中文ABC",它所占用的字节数就是:5×2=10,如图4-13所示。所以,使用UNICODE编码进行存放的字符也被称做宽字节字符。
ANSI、MBCS与UNICODE _MBCS_02 
图4-13  UNICODE下中文与字母的存储长度
在标准C++中,可以这样定义一个MBCS或者ANSI的字符串,即:
 
  1. char msg[] = "学习C++"
定义一个UNICODE的字符串,可以用L前缀,即:
  1. wchar_t msg[] = L"学习C++"
UNICODE统一了天下,但是客观事实是,所有的应用程序(包括航空公司的订单系统)不会一夜之间换用UNICODE编码,所以程序员面对的新问题是:如何编写自适应编码的程序?如何完成各种编码之间的转换?
 
===============================
ANSI、MBCS与UNICODE _UNICODE_03
以上摘自《把脉VC++》第4.5.2小节的内容 ,转载请注明出处。