In this article the author writes:
You have three valid options. All others are invalid. The third of these options is the best. Option 1: Force ANSI (slower on NT, doesn't work on CE, possible problems with internationalization)
Code:
Option 2: Force Unicode (doesn't work on 9x)
Code:
Option 3: Make it easily switchable in the project settings (easy to get working and ideal versions for everywhere)
Code:
If you include , you can use _TEXT() or _T() instead of TEXT(), but that is the only permitted variation. Everything else is invalid.
OTHER SAY:
Now go into the project settings and change using Unicode to multi-byte character set and see if it still compiles.
其实主要的问题是vc2008 字符集的问题,其中默认的[字符集]为 “使用Unicode 字符集“,所以把他改为 “使用多字节字符集”就可以了。
设置:单栏里,点“项目”,然后选“属性”(最后一项),再点“配置属性”,是个“+”号,把它展开,然后选“常规”选项卡,倒数第三项“字符集”,选择你想用的吧。
网上有人的建议:不过还是建议使用Unicode,否则你的程序将有很大的局限性;要是你的程序只在西方发布还好,但毕竟是适应中国大陆的程序吧,所以建议使用Unicode。LPSTR LPCSTR LPWSTR LPCWSTR区别
LPSTR 一个32位的指向字符串的指针 LPCSTR 一个32位的指向字符串常量的指针 LPWSTR 一个32位的指向unicode字符串的指针 LPCWSTR 一个32位的指向unicode字符串常量的指针 前面的L代表LONG,P就是指针的意思,C就是constant的意思 W是wide的意思,STR就是string的意思
LPSTR = char * LPCSTR = const char * LPWSTR = wchar_t * LPCWSTR = const wchar_t * LPOLESTR = OLECHAR * = BSTR = LPWSTR(Win32) LPCOLESTR = const OLECHAR * = LPCWSTR(Win32) LPTSTR = _TCHAR * LPCTSTR = const _TCHAR *
多字节字符串与宽字符串的转换可使用C API者Win32 API. C API: mbstowcs,wcstombs Win32 API: MultiByteToWideChar, WideCharToMultiByte
下面着重介绍Win32 API的用法,C API的用法较为简单可参照Win32 API。
首先是WideCharToMultiByte
通常你需要配置4个参数(其他参数如是使用即可),红色标记的部分。 依次是源宽字符串,需要转换的长度(-1,则为转换整个字符串),目标多字节字符串,目标缓冲区长度。 返回值表示转换为目标多字节字符串实际需要的长度(包括结束符)。 所以通常需要调用WideCharToMultiByte两次:第一次产生目标缓冲区长度,第二次产生目标字符串,像下面这样 wchar_t* wcs = L"中国,你好!I Love You!"; int lengthOfMbs = WideCharToMultiByte( CP_ACP, 0,wcs, -1, NULL, 0, NULL, NULL); char* mbs = new char[ lengthOfMbs ]; WideCharToMultiByte( CP_ACP, 0, wcs, -1, mbs, lengthOfMbs, NULL, NULL); delete mbs; mbs = NULL; MultiByteToWideChar的用法类似 char* mbs = "中国,你好!I Love You!"; int lengthOfWcs = MultiByteToWideChar( CP_ACP, 0, mbs, -1, NULL, 0 ); wchar_t* wcs = new wchar_t[ lengthOfWcs ]; MultiByteToWideChar( CP_ACP, 0, mbs, -1, wcs, lengthOfWcs ); delete wcs; wcs = NULL;
下面两个函数封装了转换过程 #include #include
std::string WcsToMbs( const std::wstring& wcs ) { int lengthOfMbs = WideCharToMultiByte( CP_ACP, 0, wcs.c_str(), -1, NULL, 0, NULL, NULL); char* mbs = new char[ lengthOfMbs ]; WideCharToMultiByte( CP_ACP, 0, wcs.c_str(), -1, mbs, lengthOfMbs, NULL, NULL); std::string result = mbs; delete mbs; mbs = NULL; return result; }
std::wstring MbsToWcs( const std::string& mbs ) { int lengthOfWcs = MultiByteToWideChar( CP_ACP, 0, mbs.c_str(), -1, NULL, 0 ); wchar_t* wcs = new wchar_t[ lengthOfWcs ]; MultiByteToWideChar( CP_ACP, 0, mbs.c_str(), -1, wcs, lengthOfWcs ); std::wstring result = wcs; delete wcs; wcs = NULL; return result;