关于char[]转换成LPCWSTR的有关问题

1、问题的缘由:VS2010默认采用宽字符UNICODE编码方式,定义了Unicode,所以相关的字符串必须为unicode字符串,而非ascii字符串。

LPCWSTR中的W是宽字符的意思,是UNICODE,就是说不是传统的char这种单字节字符,而是一个字符占两字节.
编译器把LoadImage解释成了LoadImageW,说明代码中某个地方定义了UNICODE开关,编译环境成了宽字节的,要把这个定义去掉. html

Win32 API也分2中版本, MessageBoxA / MessageBoxW,,,MessageBox根据是否认义_UNICODE宏而定义到其中一个版本。 windows

 
     2、正确的解决方案是
选择【项目菜单】->【最后的属性】->【配置属性】->【常规】->【项目默认值】->unicode改成未设置。 数组


     3、几个注意事项(此处引用了一个台湾开发论坛的几句话): ide

1,若定义UNICODE,相关字串必须使用Unicode的字串而非ANSI字串也就是wchar_t * wfilename;

(2)指定的Unicode字串常数请加L“...”;例如wchar_t *
wfilename = L “HelloWorld ”;

3.ansi字串就是传统的char*)wchar_t的*unicode的的字符串互转请用MultiByteToWideCharWideCharToMultiByte这两个API函数。

4,若是不太unicode的,那么不要UNICODE定义,用传统的方式处理。


     4、那么如何将char*或者char数组转换成VS2005中的LPCWSTR呢? 函数

(1)先看击中错误的方法: 编码

       char buffer[80];
错误方法一:
         wsprintf(buffer,L"WM_CHAR: Character = %c   ",ascii_code);
         TextOut(hdc, 0,0,(LPCWSTR)buffer, strlen(buffer));
这个只能显示第一个字母“W”
错误方法二:
         sprintf((LPCWSTR)buffer,L"Key State = 0X%X  ",key_state);
         TextOut(hdc, 0,16,(LPCWSTR)buffer, strlen(buffer));
这个出现的是乱码!
错误方法三:       
         sprintf(buffer,L"Key State = 0X%X  ",key_state);
         TextOut(hdc, 0,16,buffer, strlen(buffer));
这个提示不能将char[80]转换成LPCWSTR spa

强制类型转换是不行的,由于一个是字符占一个字节,一个事占两个字节,可是sprintf等函数是不知道的。 .net


(2)正确转换方法: code

方法一:使用MultiByteToWideChar和 MultiByteToWideChar函数,你们能够参考CSDN论坛的这篇帖子http://topic.csdn.net/u/20080229/14/eb027e95-8e4e-4afe-abf3-b85d90427355.html?seed=824864853&r=60494553#r_60494553 htm

代码以下: #include <windows.h> #include <atlstr.h> #define STRSAFE_NO_DEPRECATE #include <strsafe.h>            // for String... functions #include <crtdbg.h>                // for _ASSERTE     CStringW ConvertW(CString str, int sourceCodepage)     {         //int len=str.GetLength();         int unicodeLen=MultiByteToWideChar(sourceCodepage,0,str,-1,NULL,0) + 1;         wchar_t* pUnicode;         pUnicode=new wchar_t[unicodeLen];         memset(pUnicode,0,(unicodeLen)*sizeof(wchar_t));         MultiByteToWideChar(sourceCodepage, CP_ACP, str, -1, (LPWSTR)pUnicode, unicodeLen);         CStringW rt = pUnicode;         //delete pUnicode;         SAFE_DELETEGROUP( pUnicode );         return rt;     } 调用:        CStringW wszTemp = ConvertW( Filename, CP_ACP);         LPWSTR pwStr = wszTemp.GetBuffer(); 

相关文章
相关标签/搜索