前言
内存中的数据是单纯的二进制数据,不管你用什么指针指向这段内存,数据就是数据,不会有任何改变。
字符集:规定二进制数据和某种语言内的文字之间的对应关系,这就叫该种语言的字符集
最基本的是ASCII,规定数值48(换成二进制序列,更直观)对应字符'0'(可理解为一个图形符号),诸如此类,但由于这种对应关系的历史局限性(发明它的人当时没兴趣考虑非英文语言),同样的二进制数据,在不同的字符集内就对应不同的文字。而规定一套对应关系,使得二进制数据能够对应很多语言的文字,这就叫Unicode
char*和wchar_t*指向同一段内存,都只指向这一段二进制数据而已,区别就在于你使用这两种类型的指针来操作数据的时候,按照相应的类型来操作这段内存。
一 字符集介绍
1 char ---------------ANSI字符集 1 byte
eg:
char szString[100];
strcpy(szString,"test");
2 wchar_t ----------------Unicode字符集 2bytes
eg:
wchar_t szString[100];
wcscpy(szString,L"test");
3 TCHAR---------------如果你希望同时为ANSI和Unicode编译的源代码
eg:
TCHAR szString[100];
_tcscpy(szString,_TEXT("test"));
4 UTF-8(8-bit Unicode Transformation Format)是一种针对Unicode的可变长度字符编码,又称万国码。由Ken Thompson于1992年创建。
UTF-8用1到6个字节编码Unicode字符,但目前全世界的所有文字和符号种类加起来也只要编到 4个字节长就够了
eg:
// UTF-8 是以 8位(即 1个字节)为单元对原始码进行编码(注意一
//点:这里所讲的原始码都是指Unicode码),并规定:多字节码(2个字
//节以上才称为多字节)以转换后第1个字节起头的连续“1”的数目(这
//些连续“1”称为标记位),表示转换成几个字节:“110”连续两个
//“1”,表示转换结果为2个字节,“1110”表示3个字节,而“11110”
//则表示4个字节……跟随在标记位之后的“0”,其作用是分隔标记位和
//字符码位。第2~第4个字节的起头两个位固定设置为“10”,也作为标
//记,剩下的6个位才做为字符码位使用。
// 这样,2字节UTF-8码剩下11个字符码位,可用以转换0080~07FF的
//原始字符码,3字节剩下16个字符码位,可用以转换0800~FFFF的原始字
//符码,由此类推。编码方式的模板如下:
//
//原始码(16进制) UTF-8编码(二进制)
//--------------------------------------------
//0000 - 007F 0xxxxxxx
//0080 - 07FF 110xxxxx 10xxxxxx
//0800 - FFFF 1110xxxx 10xxxxxx 10xxxxxx
二 转换方法
1, ANSI与Unicode
Unicode称为宽字符型字串,COM里使用的都是Unicode字符串。
将ANSI转换到Unicode
(1)通过L这个宏来实现,例如: CLSIDFromProgID( L"MAPI.Folder",&clsid);
(2)通过MultiByteToWideChar函数实现转换,例如:
char *szProgID = "MAPI.Folder";
WCHAR szWideProgID[128];
CLSID clsid;
long lLen = MultiByteToWideChar(CP_ACP,0,szProgID,strlen(szProgID),szWideProgID,sizeof(szWideProgID));
szWideProgID[lLen] = '
(3)通过A2W宏来实现,例如:
USES_CONVERSION;
CLSIDFromProgID( A2W(szProgID),&clsid);
2 将Unicode转换到ANSI
(1)使用WideCharToMultiByte,例如:
// 假设已经有了一个Unicode 串 wszSomeString...
char szANSIString [MAX_PATH];
WideCharToMultiByte ( CP_ACP, WC_COMPOSITECHECK, wszSomeString, -1, szANSIString, sizeof(szANSIString), NULL, NULL );
(2)使用W2A宏来实现,例如:
USES_CONVERSION;
pTemp=W2A(wszSomeString);