VS2010 编码问题 不能将参数 1 从“ATL::CStringT<BaseType,StringTraits>”转换为“const char *”
2012-08-17 15:38
856 查看
一、
使用函数_tcscpy_s:
CStringtheString( "This is a test" );
int sizeOfString = (theString.GetLength() + 1);
LPTSTR lpsz = new TCHAR[ sizeOfString];
_tcscpy_s(lpsz, sizeOfString, theString);
最后再转换一下lpsz为const型的
LPTSTR在UNICODE环境下编译是wchar_t类型
二、
CString str =_T("Hello World!");
char szStr[256]= {0};
wcstombs(szStr,str, str.GetLength());
const char * p= szStr;
其实还可能出现其它类似的问题,如:
error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *”
error C2039: “strcpy”:不是“ATL::CStringT<BaseType,StringTraits>”的成员
但是程序在VC6下编译得很好,经过研究发现是设置上有所不同。在VC6中,默认使用MBCS编码,即多字节字符;而VC8、VC7默认的是Unicode编码,所以...
关于这两种编码有何不同,我引用了网上的一篇文章,由于作者匿名,只能在此感谢:
http://pc.nengbang.cn/group_thread/view/id-2603
在VC6中,默认使用MBCS编码,即多字节字符,实际就是支持大于0x80的ASCII码。这样,一个中文字可以表示为2个字节,GB2312就是这样表示的。
VC6的默认安装是不带UNICODE库的,要在VC6中写UNICODE程序,必须安装CRT和MFC的Unicode库。
要使你的程序支持Unicode,要在你的项目属性中去掉"_MBCS"宏定义,增加"UNICODE"和"_UNICODE"两个宏定义。(注意,这两个都应该加上,因为CRT和MFC使用UNICODE定义,而STL则使用_UNICODE)
如果你的程序是MFC的,则Unicode版MFC库的入口点是wWinMainCRTStartup。
为了方便开发者,VC6中提供了Tchar.h,里面定义了一些宏用来帮助写两种编码都兼容的代码。
类型
一般文本 数据类型名称_UNICODE 和 _MBCS 未定义 _MBCS 已定义 _UNICODE 已定义
_TCHAR char char wchar_t
_TINT int int wint_t
_TSCHAR signed char signed char wchar_t
_TUCHAR unsigned char unsigned char wchar_t
_TXCHAR char unsigned char wchar_t
_T 或 _TEXT 无效(由预处理器移除)无效(由预处理器移除)L(将后面的字符或字符串转换成相应的 Unicode形式)
CRT中的相关函数在Tchar.h中都定义了相应的替代,基本是将str换成了_tcs,比如:CRT中的unsigned intstrlen(const char *)现在是unsigned int _tcslen(constTCHAR*),在Uniocde时,将被替换为unsigned int _wcslen(constwchar_t)*,而在MBCS时,会被替换为unsigned int _mcslen(const char*)。
看,写Unicode和MBCS兼容的代码挺容易的吧,我总结了一些替换规则
1 将char换成TCHAR (unsigned char必须去掉unsigned)
2 将str函数换成_tcs函数
3 将字符串常量定义加要_T("")宏
4 printf函数族必须修改为wprintf,不过要注意千万不要使用wprintf函数来解析char型
很多时候程序中既需要Unicode,又需要使用ASCII,这时需要用到操作系统的2个API
WideCharToMultiByte用来将Unicode字符串转化为MBCS的
MultiByteToWideChar用来将MBCS字符串转化为Unicode的
一些注意事项:
在Unicode编码下,sizeof没那么可靠了,memset( 0sizeof())的习惯用法可能会出大错,改成memset(0sizeof()/szieof(TCHAR))就没事了,呵呵
在Unicode下,一个中文字符就是一个字符,len= strlen() / 2;这样可不行了
用VC6进行UNICODE编程
最近试图将自己的程序编译成Unicode版本,费了不少力气,相关内容整理如下,适用于VC6,但VC7、VC8应该也差不多的(后者新建项目缺省即按Unicode编译)。
1. 添加 UNICODE 和 _UNICODE 预处理定义
位置:Project Settings -> C/C++ ->Preprocessor definitions
添加了这两个定义后,MFC的一些内置类型如 TCHAR、CString 都将转为支持宽字符类型(wchar_t)
2. 使用宽字符相关类型,如:
char -> TCHAR、char * -> LPTSTR、constchar * -> LPCTSTR
3. 对字符串常量使用 _T() 宏
4. 替换C库中的中字符串操作函数,如 strlen -> _tcslen、strcmp-> _tcscmp 等
类似的还有C库中字符串与数字的转换函数,如 atoi -> _ttoi、itoa-> _itot 等
5. 将 Project Settings -> link ->Output -> Entry Point 设为 wWinMainCRTSTartup
否则会有如下错误:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved externalsymbol _WinMain@16
6. C++标准库中的string,有对应的宽字符版本wstring,两者均为basic_string的特化版本
可在StdAfx.h中:
#ifdef _UNICODE
#define tstring wstring
#else
#define tstring string
#endif
然后在代码中使用 tstring 即可,类似的还有 fstream/wfstream、ofstream/wofstream等
7. 宽字符版本的英文字符仍可直接与整型值进行比较,如:
CString s = _T("ABC");
ASSERT(s[0] == 'A');
8. 对于仍需使用ANSI字符串的地方,如第三方类库的接口,仍可继续使用;如需进行Unicode字符串和ANSI字符串的互转换,可使用MultiByteToWideChar 和 WideCharToMultiByte
使用函数_tcscpy_s:
CStringtheString( "This is a test" );
int sizeOfString = (theString.GetLength() + 1);
LPTSTR lpsz = new TCHAR[ sizeOfString];
_tcscpy_s(lpsz, sizeOfString, theString);
最后再转换一下lpsz为const型的
LPTSTR在UNICODE环境下编译是wchar_t类型
二、
CString str =_T("Hello World!");
char szStr[256]= {0};
wcstombs(szStr,str, str.GetLength());
const char * p= szStr;
其实还可能出现其它类似的问题,如:
error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *”
error C2039: “strcpy”:不是“ATL::CStringT<BaseType,StringTraits>”的成员
但是程序在VC6下编译得很好,经过研究发现是设置上有所不同。在VC6中,默认使用MBCS编码,即多字节字符;而VC8、VC7默认的是Unicode编码,所以...
关于这两种编码有何不同,我引用了网上的一篇文章,由于作者匿名,只能在此感谢:
http://pc.nengbang.cn/group_thread/view/id-2603
在VC6中,默认使用MBCS编码,即多字节字符,实际就是支持大于0x80的ASCII码。这样,一个中文字可以表示为2个字节,GB2312就是这样表示的。
VC6的默认安装是不带UNICODE库的,要在VC6中写UNICODE程序,必须安装CRT和MFC的Unicode库。
要使你的程序支持Unicode,要在你的项目属性中去掉"_MBCS"宏定义,增加"UNICODE"和"_UNICODE"两个宏定义。(注意,这两个都应该加上,因为CRT和MFC使用UNICODE定义,而STL则使用_UNICODE)
如果你的程序是MFC的,则Unicode版MFC库的入口点是wWinMainCRTStartup。
为了方便开发者,VC6中提供了Tchar.h,里面定义了一些宏用来帮助写两种编码都兼容的代码。
类型
一般文本 数据类型名称_UNICODE 和 _MBCS 未定义 _MBCS 已定义 _UNICODE 已定义
_TCHAR char char wchar_t
_TINT int int wint_t
_TSCHAR signed char signed char wchar_t
_TUCHAR unsigned char unsigned char wchar_t
_TXCHAR char unsigned char wchar_t
_T 或 _TEXT 无效(由预处理器移除)无效(由预处理器移除)L(将后面的字符或字符串转换成相应的 Unicode形式)
CRT中的相关函数在Tchar.h中都定义了相应的替代,基本是将str换成了_tcs,比如:CRT中的unsigned intstrlen(const char *)现在是unsigned int _tcslen(constTCHAR*),在Uniocde时,将被替换为unsigned int _wcslen(constwchar_t)*,而在MBCS时,会被替换为unsigned int _mcslen(const char*)。
看,写Unicode和MBCS兼容的代码挺容易的吧,我总结了一些替换规则
1 将char换成TCHAR (unsigned char必须去掉unsigned)
2 将str函数换成_tcs函数
3 将字符串常量定义加要_T("")宏
4 printf函数族必须修改为wprintf,不过要注意千万不要使用wprintf函数来解析char型
很多时候程序中既需要Unicode,又需要使用ASCII,这时需要用到操作系统的2个API
WideCharToMultiByte用来将Unicode字符串转化为MBCS的
MultiByteToWideChar用来将MBCS字符串转化为Unicode的
一些注意事项:
在Unicode编码下,sizeof没那么可靠了,memset( 0sizeof())的习惯用法可能会出大错,改成memset(0sizeof()/szieof(TCHAR))就没事了,呵呵
在Unicode下,一个中文字符就是一个字符,len= strlen() / 2;这样可不行了
用VC6进行UNICODE编程
最近试图将自己的程序编译成Unicode版本,费了不少力气,相关内容整理如下,适用于VC6,但VC7、VC8应该也差不多的(后者新建项目缺省即按Unicode编译)。
1. 添加 UNICODE 和 _UNICODE 预处理定义
位置:Project Settings -> C/C++ ->Preprocessor definitions
添加了这两个定义后,MFC的一些内置类型如 TCHAR、CString 都将转为支持宽字符类型(wchar_t)
2. 使用宽字符相关类型,如:
char -> TCHAR、char * -> LPTSTR、constchar * -> LPCTSTR
3. 对字符串常量使用 _T() 宏
4. 替换C库中的中字符串操作函数,如 strlen -> _tcslen、strcmp-> _tcscmp 等
类似的还有C库中字符串与数字的转换函数,如 atoi -> _ttoi、itoa-> _itot 等
5. 将 Project Settings -> link ->Output -> Entry Point 设为 wWinMainCRTSTartup
否则会有如下错误:
msvcrtd.lib(crtexew.obj) : error LNK2001: unresolved externalsymbol _WinMain@16
6. C++标准库中的string,有对应的宽字符版本wstring,两者均为basic_string的特化版本
可在StdAfx.h中:
#ifdef _UNICODE
#define tstring wstring
#else
#define tstring string
#endif
然后在代码中使用 tstring 即可,类似的还有 fstream/wfstream、ofstream/wofstream等
7. 宽字符版本的英文字符仍可直接与整型值进行比较,如:
CString s = _T("ABC");
ASSERT(s[0] == 'A');
8. 对于仍需使用ANSI字符串的地方,如第三方类库的接口,仍可继续使用;如需进行Unicode字符串和ANSI字符串的互转换,可使用MultiByteToWideChar 和 WideCharToMultiByte
相关文章推荐
- error C2664: “ATL::CStringT<BaseType,StringTraits>::Remove”: 不能将参数 1 从“const char [2]”转换为“char”
- error C2664: “ATL::CStringT<BaseType,StringTraits>::Remove”: 不能将参数 1 从“const char [2]”转换为“char”
- error C2440: “初始化”: 无法从“const char *”转换为“ATL::CStringT<BaseType,StringTraits>”
- “ATL::CStringT<BaseType,StringTraits>::operator +”: 3 个重载有相似的转换
- error C2664: “void ATL::CStringT<BaseType,StringTraits>::Format(const wchar_t *,...)”: 不能将
- error C2440: “初始化”: 无法从“wchar_t *”转换为“ATL::CStringT<BaseType,StringTraits>”
- error C2440: “初始化”: 无法从“wchar_t *”转换为“ATL::CStringT<BaseType,StringTraits>”
- 解决:错误1 error C2440: “初始化”: 无法从“char *”转换为“ATL::CStringT<BaseType,StringTraits>
- error C2039: “SetWindowTextA”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员
- Debug编译运行都没有问题,Release编译错误error C2664: 'ATL::CStringT<BaseType,StringTraits>::CStringT(const VARIANT
- error C2664: 'void ATL::CStringT<BaseType,StringTraits>::Format (...)
- Bug3 ---error C2039: “SetWindowTextA”: 不是“ATL::CStringT<BaseType,StringTraits>”的成员
- "std::basic_stringbuf<char, std::char_traits<char>, std::allocator<char> >::str() const"问题的解决办法
- Cstring转int型问题(error C2664: “atoi”: 不能将参数 1 从“CString”转换为“const char *”))
- VS2010不能将参数 1 从“std::string”转换为“const char *”解决
- 关于CString剖析,“strcmp”: 不能将参数1从“CString”转换为“const char *”问题 from http://blog.csdn.net/cobay/article/details/3556307
- inet_addr”: 不能将参数 1 从“CString”转换为“const char *”1>
- 【CString与string转换】不存在从 "LPWSTR" 转换到 "std::basic_string<char, std::char_traits<char>, std::allocator(转)
- C++: VC6转VC8出现问题:error C2664: “fopen”: 不能将参数 1 从“CString”转换为“const char *” from http://www.cnblogs.com/moon2bird/archive/2009/02/27/1399675.html
- Cstring转int型问题(error C2664: “atoi”: 不能将参数 1 从“CString”转换为“const char *”))