Unicode UTF GBK 单字节 多字节.doc
话说字符集
李貌 -- Fiberhome 摘要:
本文简要陈述Unicode、USC、UTF、GBK、单字节、多字节的基本概念,并说明它们之间的联系与区别。关于USC的编码对应关系、UTF的
定义等细节,不在本文讨论范围内。
1. 概念
Unicode:是一种在计算机上使用的字符编码。其中文称呼为统一码、万国码或单一码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。说明:这是概念,是抽象的东西;其通过USC与UTF的细化,真正实现跨语言、跨平台的特性。
USC:通用字符集,是Universal Character Set的缩写,是Unicode的编码
。说白了,就是字符与编码(数字)的对应关系的标准。USC分为USC-2和USC-4。简单的说,UCS-2用两个字节编码,UCS-4用4个字节编码。显而易见,由于两字节编码只能存储2^16(65536)个字符,无法存储全球字符(即全球各国的字符总和大于2^16个),故产生UCS-4标准。通常我们不区分Unicode与USC,即说UNICODE时也就是说UCS。
UTF:字符集转换(或者传输)格式,是UCS Transformation Format的缩写。它定义了Unicode的编码(数字)转换成程序数据。它是网络上不同国家不同操作系统进行字符串传输、交换的重要依据。UTF 分为UTF-8、UTF-16、UTF-32。UTF-8、UTF-16、UTF-32分别以BYTE、WORD、DWORD作为编码单位(传输过程中的最小单元)。
GBK:(汉语)国标字符集。与USC一样,只是GBK是中国人自己为汉字进行编码而定义的统一字符集。GBK是规范中文编码过程中的重要成果,是一项国家标准。中文编码标准主要存在GB2312、GBK、GB18030三个版本。GBK是windows中文操作系统缺省使用的字符集。
BIG-5:繁体中文码,是通行于台湾、香港地区的一个繁体字编码
,俗称“大五码”。
单字节SBCS:single-byte character set,用一个Byte来编码字符。如:ASCII。
多字节MBCS:multi-byte character set,用多个Byte来编码字符。如Unicode,GBK。
双字节DBCS:double-byte character set,多字节的特例。由于大多数字符编码的存储,仅需要用双字节就够了。即用两个字节能表示的字符,占总字符量的绝大部分,三个或三个以上字节表示的字符,通常我们是不会用到的。
宽字节wchar:wide character,两字节表示的UNICODE编码(至少windows是这样的),即UCS-2标准定义的UNICODE。
2. 区别与联系
2.1. 字符集
1. Unicode的编码规范是UCS,Unicode编码的传输规范是UTF。UCS是字符与编码
的对应关系的标准,UTF是该编码在计算机中存储、传输、交换的规范。 2. UCS-2( PK )UCS-4。UCS-2用两个字节编码,UCS-4用4个字节编码。UCS-4
兼容UCS-2,USC-2字符通过加宽为4字节,就是其在UCS-4中的编码。 3. UTF是传输规范。如“汉”字符对应的编码(数字)是0x6c49,而编码在传输过
程中对应UTF-8编码数据是: BYTE data_utf8[] = {0xE6, 0xB1, 0x89}(关于如何
转换,不在本文讨论范围)。
4. UTF-8( PK )UTF-16( PK )UTF32。UTF-8、UTF-16、UTF-32分别以BYTE、
WORD、DWORD作为编码单位。(关于其区别,我想只有你了解了它们的编码转
换
,才能有一个深刻的体会)
5. GBK( PK )UCS。理想总是好的,现实总是残酷的。UCS定义了一套很好的国
际化字符集标准,但是并不是所有国家或语种都买账。GBK就是国人为了能够很
好的在计算机中表示汉语字符而确定的编码标准。(当然也有历史原因,GB字符
集产生要比UCS早)
6. UTF-16与UTF-32中的字符序问
,即Big-endian与Little-endian。Big-endian与
Little-endian是计算机系统存储16位数据特有的问题。Big-endian是指高8位字节
在低位字节的前面(符合人的认知习惯),Little-endian则相反。值得一提的是,目
前流行的INTEL-x86-CPU所采用的是Little-endian(强烈鄙视、无语)。
2.2. 编码方式与字符集
1. 单字节( PK )多字节( PK )双字节。不多说,看概念就知道。 2. 多字节( PK )宽字节。一般的,就是指本地化(区域)字符转UNICODE字符。
(其实UNICODE编码也是多字节的,但一般都不把它归为多字节字符集,除非你
自称火星人)。
3. 宽字节( PK )UNICODE。个人认为,就是UCS-2编码标准对应的计算机数据
存储类型。
4. 代码页在多字节转宽字节过程中起到编码对应表的作用。如代码页“.936”,存储
了GBK到UNICODE编码(数字)的对应关系。
3. 字符集转换
本节仅列举windows下的字符集转换函数。
1. mbstowbs。多字节转宽字节字符串。注意:调用前,需要配置地域化信息。地域
化设置函数setlocale。
2. wbstombs。
3. MultiByteToWideChar。
4. WideCharToMultiByte。
5. LCMapString。简体与繁体汉字的互转。