tchar与char不兼容_char和TCHAR之间转换

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;

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值