Ansi与Unicode编码

 

窄字节与宽字节

视频教程: Ansi与Unicode编码

VC++6.0默认Ansi编码,VS2005以后默认Unicode编码 

Ansi=窄字节     Unicode=宽字节

Ansi用char格式表示一个字符,占用一个字节的存储空间,最多表示255个字符

Unicode用两个字节表示一个字符,格式是unsigned short,被定义成wchar_t格式 

 

大家在编程时经常遇到的数据类型:

● Ansi:

char   代表一个字符  (CHAR)

char *  代表一个字符串指针   (PCHAR    PSTR   LPSTR)

const char *   代表常量字符串的指针  (LPCSTR)

Unicode:

wchar_t   WCHAR

wchar_t *     PWCHAR、PWSTR、LPWSTR

赋值时注意:str=L”liming”     加上L

const wchar_t *        LPCWSTR

● T 通用类型:

TCHAR、(TCHAR * 、PTCHAR、PTSTR、LPTSTR)、LPCTSTR

赋值时注意:str=_T(”liming”)     加上_T( )或_TEXT()

 

注意:P是指针的意思       STR是字符串的意思       L是长指针的意思(在WIN32下可以忽略)

           C是 const常量的意思          W代表宽字节的意思         

          T通用类型的意思(优点:修改工程编码之后不用修改代码)

 

字符串类型的对象的定义:

● Ansi:char *pAnsiStr = "hello";

● Unicode:wchar_t *pUnicodeStr = L"hello";

● 通用类型:TCHAR *pTStr = _T("hello"); 或者 TCHAR *pTStr = _TEXT("hello");

● 动态申请内存:TCHAR *pszBuf = new TCHAR[100];

 

窄字节(Ansi)与宽字节(Unicode)的转换

Unicode转ANSI(或UTF8)

    wchar_t* pwszUnicode = L"Holle李明";
    char* pszMultiByte=NULL;   //因为事先不知道窄字节空间大小,所以指定为NULL
    int iSize = WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, NULL, 0, NULL, NULL);//宽字节转换成其它字节 
    //参数1:CP_ACP   转换成Ansi           
    //       CP_UTF8  转换为UTF8
    //参数2:指定如何处理没有转换的字符,但不设此参数函数会运行的更快一些,一般都是把它设为0
    //参数3:待转换的宽字符串
    //参数4:待转换宽字符串的长度,-1表示转换到字符串结尾
    //参数5:接收转换后输出新串的缓冲区
    //参数6:输出缓冲区大小;如果为0,参数5将被忽略(设为NULL),函数将返回所需缓冲区大小而不使用参数5
    //参数7:指向字符的指针, 在指定编码里找不到相应字符时使用此字符作为默认字符代替。如果为NULL则使用系统默认字符
    //参数8:开关变量的指针,用以表明是否使用过默认字符。对于要求此参数为NULL的参数2(dwFlags)而使用此参数
    //       参数7和参数8都设为NULL,函数会更快一些
    //转换后所占用的空间
    //上面函数说明:由于参数6为0,所以参数5位NULL; 返回值为10 ----这一步的目的是求窄字节的空间

    pszMultiByte = new char[iSize];  
    //给窄字节申请空间
    ZeroMemory(pszMultiByte, iSize); //内存清零
    //用0来填充一块内存区域
    //参数1:指向一块准备用0来填充的内存区域的开始地址
    //参数2:准备用0来填充的内存区域的大小,按字节来计算

    WideCharToMultiByte(CP_ACP, 0, pwszUnicode, -1, pszMultiByte, iSize, NULL, NULL);
    //进行转换

 

  

ANSI(或UTF8)转Unicode

    char* pszMultiByte = "Holle李明";
    wchar_t* pwszUnicode = NULL;//因为事先不知道宽字节空间大小,所以指定为NULL
    int n= MultiByteToWideChar(CP_ACP,NULL, pszMultiByte,-1,NULL,0);
    //参数1:CP_UTF8:转换为UTF-8
    //       CP_ACP:ANSI字符集
    //参数2:一组位标记用以指出是否未转换成预作或宽字符(若组合形式存在),是否使用象形文字替代控制字符,以及如何处理无效字符
    //       一般为 NULL
    //参数3:待转换的窄字符串
    //参数4:待转换窄字符串的长度,-1表示转换到字符串结尾
    //参数5:接收转换后输出新串的缓冲区
    //参数6:输出缓冲区大小,如果为0,参数5将被忽略(设为NULL),函数将返回所需缓冲区大小而不使用参数5
    //返回值=8     这一步的目的是求宽字节的占用空间

    pwszUnicode = new wchar_t[n];
    //给宽字节申请空间
    ZeroMemory(pwszUnicode, n); //内存清零
    MultiByteToWideChar(CP_ACP, NULL, pszMultiByte, -1, pwszUnicode, n);
    //转换 

 

使用宏转换

    
    wchar_t* pwszUnicode = L"Holle李明";

    USES_CONVERSION;  //一定加上,否则编译出错
    char* pszMultiByte = W2A(pwszUnicode);//宽字节转换成窄字节
    //A2W    窄字节 转换成宽字节
    //T2A    通用转换成窄字节
    //T2W    通用转换成宽字节 
    

 

  

 

 

 

posted @ 2019-03-09 05:25  天子骄龙  阅读(650)  评论(0编辑  收藏  举报