MBCS与Unicode码
MBCS(多字节码)
早在Windows采用Unicode统一编码进行语言管理之前,Windows为了能够进行非ANSI标准字符的输出,于是采用两个字节来表示这些语言文字。因为这些双字节文字和ANSI是混和在一起的,为了加以区别,Windows将这些字符的最高位置为1(即这些双字节文字的每个字节都>=127),所以这种表示法可以表示 127x127 约一万多种非ANSI文字,其本上可以表示任何一种语言的常用文字了。于是,Windows为每一个区域版本,都制定了分别独立的文字编码,这就是MBCS(多字节码)。
Unicode(统一码、万国码、单一码)
是一种在计算机上使用的字符编码。它为每种语言中的每个字符设定了统一并且唯一的二进制编码,以满足跨语言、跨平台进行文本转换、处理的要求。
在Unicode中:汉字“字”对应的数字是23383。在Unicode中,我们有很多方式将数字23383表示成程序中的数据,包括:UTF-8、UTF-16、UTF-32
UTF-8以字节为单位对Unicode进行编码。从Unicode到UTF-8的编码方式如下:
Unicode编码(16进制) ║ UTF-8 字节流(二进制)
000000 - 00007F ║ 0xxxxxxx
000080 - 0007FF ║ 110xxxxx 10xxxxxx
000800 - 00FFFF ║ 1110xxxx 10xxxxxx 10xxxxxx
010000 - 10FFFF ║ 11110xxx 10xxxxxx 10xxxxxx 10xxxxxx
UTF-8的特点是对不同范围的字符使用不同长度的编码。对于0x00-0x7F之间的字符,UTF-8编码与ASCII编码完全相同。UTF-8编码的最大长度是4个字节。从上表可以看出,4字节模板有21个x,即可以容纳21位二进制数字。Unicode的最大码位0x10FFFF也只有21位。
例1:“汉”字的Unicode编码是0x6C49。0x6C49在 0x0800-0xFFFF之间,使用用3字节模板了:1110xxxx 10xxxxxx 10xxxxxx。将0x6C49写成二进制是:0110 1100 0100 1001,用这个比特流依次代替模板中的x,得到:11100110 10110001 10001001,即E6 B1 89。
L""表示Unicode字符(请切记:WCHAR即ushort只表示宽字符,而宽字符并不就是unicode,反而Unicode属于宽字符).
我们可以使用%S等进行转换MBCS/Unicode转换
setlocale(LC_ALL,"");
TCHAR sxStr1[] = TEXT("12汉字");//根据平台自动选择字符集
char szStr2[] = "12汉字"; //MBCS码
WCHAR swzStr3[] = L"12汉字"; //UNICODE码
printf("%d,%d\n",sizeof("abc"),sizeof(L"abc"));
printf("//depend on platform\n");
_tprintf(TEXT("_tcsclen(\"%s\")=%d,sizeof(\"%s\")=%d\n"),sxStr1,_tcsclen(sxStr1),sxStr1,sizeof(sxStr1));
strPrt0X(sxStr1,10);
printf("//MBCS\n");
printf("strlen(\"%s\")=%d,sizeof(\"%s\")=%d\n",szStr2,strlen(szStr2),szStr2,sizeof(szStr2));
strPrt0X(szStr2,10);
printf("//MBCS\n");
printf("_mbstrlen(\"%S\")=%d,sizeof(\"%s\")=%d\n",swzStr3,_mbstrlen(szStr2),szStr2,sizeof(szStr2));
strPrt0X(szStr2,10);
printf("//Unicode\n");
wprintf(L"wcslen(\"%S\")=%d,sizeof(\"%s\")=%d\n",szStr2,wcslen(swzStr3),swzStr3,sizeof(swzStr3));
strPrt0X(swzStr3,10);
#在工程设置为"Unicode字符集"时候
4,8
//depend on platform
_tcsclen("12汉字")= 4,sizeof("12汉字")=10
31 00 32 00 49 6c 57 5b
//MBCS
strlen("12汉字")= 6,sizeof("12汉字")=7
31 32 ffffffba ffffffba ffffffd7 ffffffd6
//MBCS
_mbstrlen("12汉字")=4,sizeof("12汉字")=7
31 32 ffffffba ffffffba ffffffd7 ffffffd6
//Unicode
wcslen("12汉字")= 4,sizeof("12汉字")=10
31 00 32 00 49 6c 57 5b
#在工程设置为"未设置"时候
4,8
//depend on platform
_tcsclen("12汉字")= 6,sizeof("12汉字")=7
31 32 ffffffba ffffffba ffffffd7 ffffffd6
//MBCS
strlen("12汉字")= 6,sizeof("12汉字")=7
31 32 ffffffba ffffffba ffffffd7 ffffffd6
//MBCS
_mbstrlen("12汉字")=4,sizeof("12汉字")=7
31 32 ffffffba ffffffba ffffffd7 ffffffd6
//Unicode
wcslen("12汉字")= 4,sizeof("12汉字")=10
31 00 32 00 49 6c 57 5b 00 00