1.unicode环境下字符转换问题
代码:char szChar[20];
sprintf_s(szChar,"char is %d",wParam);
MessageBox(hwnd,szChar,"char_test",0);
报错:不能将参数 2 从“char [20]”转换为“LPCWSTR”
解决办法:要么
char szChar[20];
sprintf_s(szChar,"char is %d",wParam);
MessageBoxA(hwnd,szChar,"char_test",0);
要么
wchar_t szChar[20];
swprintf_s(szChar,L"char is %d",wParam);
MessageBoxW(hwnd,szChar,L"char_test",0);
要么可以兼容UNICODE和ANSI
TCHAR szChar[20];
_stprintf_s (szChar,_T("char is %d"),wParam);
MessageBox(hwnd,szChar,_T("char_test"),0);
TCHAR szChar[20];
_tprintf(szChar,_T("char is %d"),wParam);
MessageBox(hwnd,szChar,_T("text"),wParam);
宽字符转换 TEXT("我是字符串"),_T("我是字符串") L"我是字符串" 需引用 #include <tchar.h>
宽字符下 TextOut(hdc, 10, 20, "Hello, Windows!", strlen("Hello, Windows!"));
应该改为:TextOut(hdc, 10, 20, L"Hello, Windows!", wcslen(L"Hello, Windows!"));
2.无法从 const char 转换为 LPCWSTR
CString ——〉char *
CString mystring = "abcde";
char* szmystring = (char *)(LPCTSTR)mystring;
char * ——〉CString
char* mystring = "12345";
CString string = mystring;
char* pBuffer =new char[1024];
CString strBuf = "test";
pBuffer = strBuf.GetBuffer(sizeof(pBuffer));
//wchar_t和WCHAR相同
typedef wchar_t WCHAR;
//对于LPCTSTR根据以下的定义,实际就是说
//LPCTSTR就是const wchar_t *或者const WCHAR *
typedef LPCWSTR PCTSTR, LPCTSTR;
typedef __nullterminated CONST WCHAR *LPCWSTR, *PCWSTR;
BOOL实际为int类型:
typedef int BOOL;
应用举例:
CREATESTRUCT结构中的
LPCTSTR lpszName 这个标题字符串是LPCTSTR类型,在Unicode编码下,直接使用
cs.lpszName = "a" 会直接error C2440: “=”: 无法从“const char [2]”转换为“LPCWSTR”
很明显,上述lpszName被定义为LPCWSTR,即WCHAR *,因此可以使用
cs.lpszName = (WCHAR *)"aAA";
可惜虽然不会有编译错误的提示,但是显示乱码,原因在于wchar_t定义的是宽字符集,因此要如下定义:
cs.lpszName = (WCHAR *)_T("aAA");
好,这样就通过了!
这里需要注意,如果使用:
CString str_cap("haha");
cs.lpszName = (const WCHAR *)(str_cap);
虽然可以编译过去,但是仍然是乱码,原因是CString没有转宽字符集,方法调用CString::AllocSysString(),注意_T()是不行的!
具体代码:
CString str_cap("haha");
cs.lpszName = (const WCHAR *)(str_cap.AllocSysString());
//cs.lpszName = (LPCTSTR)(str_cap.AllocSysString()); 同上面效果相同
#include <atlbase.h>
USES_CONVERSION;
LPCWSTR pw = T2W( "Hello,world! "); // tchar -> wchar
LPCTSTR pt = W2T(L "Hello,world! "); // wchar -> tchar
ascII码转unicode
#include "atlconv.h"
USES_CONVERSION;
char szChar[20];
swprintf(wsz,L"%S",szChar);
MessageBox(hwnd,A2W(szChar),L"weixin",0);
3.
char,CHAR,TCHAR,WCHAR,LPSTR,LPCSTR,LPCTSTR
一
char是C语言标准数据类型,字符型,至于由几个字节组成通常由编译器决定,一般一个字节。
Windows为了消除各编译器的差别,重新定义了一些数据类型,提到的另外几个类型都是这样。CHAR为单字节字符。还有个WCHAR为Unicode字符,即不论中英文,每个字有两个字节组成。如果当前编译方式为 ANSI(默认)方式,TCHAR等价于CHAR,如果为Unicode方式,TCHAR等价于WCHAR。在当前版本LPCSTR和LPSTR没区别,即以零结尾的字符串指针,相当于CHAR *。 LPSTR、LPCSTR相当于char *,所以这种类型
变量的赋值等同于char *的赋值。
下面给出两个例子,一个是直接赋值,另一个是间接的。
二 细说LPCTSTR和LPCSTR
L表示long指针, 这是为了兼容Windows 3.1等16位操作系统遗留下来的, 在win32中以及其他的32为操作系统中, long指针和near指针及far修饰符都是为了兼容的作用。没有实际意义。
P表示这是一个指针,C表示是一个常量T在Win32环境中, 有一个_T宏,这个宏用来表示你的字符是否使用UNICODE, 如果你的程序定义了UNICODE或者其他相关的宏,那么这个字符或者字符串将被作为UNICODE字符串,否则就是标准的ANSI字符串。STR表示这个变量是一个字符串。
所以LPCTSTR就表示一个指向常固定地址的可以根据一些宏定义改变语义的字符串。同样, LPCSTR就只能是一个ANSI字符串,在程序中我们大部分时间要使用带T的类型定义。LPCTSTR == const TCHAR *
(LP的含义是长指针(long pointer)。LPSTR是一个指向以‘\0’结尾的ANSI字符数组的指针,与char*可以互换使用,在win32中较多地使用LPSTR。
而LPCSTR中增加的‘C’的含义是“CONSTANT”(常量),表明这种数据类型的实例不能被使用它的API函数改变,除此之外,它与LPSTR是等同的。
CString是LPCSTR,也就是说MessageBox()中参数可以CString型,也可以用*CHAR型.)