VS2005问题,谁先回答正确谁得100分,就这么简单!!

满衣兄 2009-03-13 03:18:28
描述:在VS2005环境下,编码方式为UNICODE,如何将CString类型转换为char *类型?
我是这么做的:

class CTypeChange
{
public:
char *CStringToPchar(CString src,char *dst=NULL);
};
char *CTypeChange::CStringToPchar(CString src,char *dst)
{
wchar_t* wCharTmp = src.GetBuffer(src.GetLength()+1);
size_t len = wcslen(wCharTmp) + 1;
size_t convertedChars = 0;
dst=new char(len);
wcstombs_s(&convertedChars, dst, len, wCharTmp , _TRUNCATE);
return dst;
}

调用:
CString src="当爱已成往事";
CString src1="abcdefg";

CStringToPchar(src); //错误,输出的是空白
CStringToPchar(src1);//正确,输出abcdefg


很清楚了,中文不行,要怎么修改?或者给我个其它方法。谢谢。
注意:VC6.0的方法好象不行,如果有VS2005环境的最好自己先试一下。
...全文
134 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
fredhong 2009-03-13
  • 打赏
  • 举报
回复
中文是两个字节的,用WideCharToMultiByte吧。

CString src= _T("当爱已成往事");
DWORD dwNum = WideCharToMultiByte(CP_ACP,NULL,src,-1,NULL,0,NULL,FALSE);
char *psText;
psText = new char[dwNum];
if(!psText)
{
delete []psText;
}
WideCharToMultiByte (CP_ACP,NULL,src,-1,psText,dwNum,NULL,FALSE);
delete []psText;
wuyu637 2009-03-13
  • 打赏
  • 举报
回复
char *CStringToPchar(CString src);
char* CStringToPchar(CString src)
{
wchar_t* lpUnicodeStr = src.GetBuffer(src.GetLength()+1);
size_t len = wcslen(lpUnicodeStr) + 1;
size_t convertedChars = 0;
char *dest= new char(len);

int nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,NULL,0,NULL,NULL); //获取转换到UTF8编码后所需要的字符空间长度
delete []dest;
dest = new char(nRetLen);
nRetLen = ::WideCharToMultiByte(CP_UTF8,0,lpUnicodeStr,-1,(char *)dest,nRetLen,NULL,NULL); //转换到UTF8编码

return dest;
}


int main()
{
CString src="当爱已成往事";
CString src1="abcdefg";

char* temp ;
temp = CStringToPchar(src); //错误,输出的是空白
cout << temp << endl;

ofstream outfile;
outfile.open("data.txt",ios::binary);
outfile << temp << endl;
outfile.close();

//char *temp2 = CStringToPchar(src1);//正确,输出abcdefg
//cout << temp2 << endl;
}
healer_kx 2009-03-13
  • 打赏
  • 举报
回复
对不起,没那么大的。。。接分。
满衣兄 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 arong1234 的回复:]
你得实现是有非常大得局限性的。对于把一个常量字符串(CString等价于LPCTSTR,因此在不考虑CString这种不兼容对象情况下,它是常量),你应该分配一个字符串空间,然后拷贝进去


C/C++ code
class CTypeChange
{
public:
//这里第一个参数应该用const CString&,避免对象拷贝
char *CStringToPchar(const CString& src,char *dst=NULL);
};
char *CTypeChange::CStringToPchar(const CString& src,char *dst…
[/Quote]
好,非常感谢。揭贴。
sagegz 2009-03-13
  • 打赏
  • 举报
回复
牛人,友情UP~!
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 arong1234 的回复:]
你得实现是有非常大得局限性的。对于把一个常量字符串(CString等价于LPCTSTR,因此在不考虑CString这种不兼容对象情况下,它是常量),你应该分配一个字符串空间,然后拷贝进去


C/C++ code
class CTypeChange
{
public:
//这里第一个参数应该用const CString&,避免对象拷贝
char *CStringToPchar(const CString& src,char *dst=NULL);
};
char *CTypeChange::CStringToPchar(const CString& src,char *dst…
[/Quote]
up
北极猩猩 2009-03-13
  • 打赏
  • 举报
回复
就别用char * 用TCHAR
arong1234 2009-03-13
  • 打赏
  • 举报
回复
你得实现是有非常大得局限性的。对于把一个常量字符串(CString等价于LPCTSTR,因此在不考虑CString这种不兼容对象情况下,它是常量),你应该分配一个字符串空间,然后拷贝进去


class CTypeChange
{
public:
//这里第一个参数应该用const CString&,避免对象拷贝
char *CStringToPchar(const CString& src,char *dst=NULL);
};
char *CTypeChange::CStringToPchar(const CString& src,char *dst)
{
//不知道为什么那么多人喜欢用GetBuffer,这里GetBuffer的目的
//是什么?!你后面所有的计算都不需要一个可写的wchar_t类型
//而且对于这样的函数你要避免假定它现在是Unicode编译模式,
//否则一旦你关闭unicode编译模式怎么办?
//wchar_t* wCharTmp = src.GetBuffer(src.GetLength()+1);
//直接使用GetLength效率要高很多,为什么需要重新计算length
size_t len = src.GetLength() +1;
//size_t len = wcslen(wCharTmp) + 1;
//size_t convertedChars = 0;
if(NULL == dst) {//注意,如果没有这个判断,你在参数列表中加dst就没有意义了
//dst=new char(len);
dst = new char [len];//注意小括号和中括号
};
//还是一样,避免假定这个编译模式是Unicode的,否则你代码太不自适应了
//wcstombs_s(&convertedChars, dst, len, wCharTmp , _TRUNCATE);
USES_CONVERSION;
strcpy(dst, T2A(str));
return dst;
}
满衣兄 2009-03-13
  • 打赏
  • 举报
回复
有其它行的方法吗?郁闷
满衣兄 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 TeaTimeL 的回复:]
将第二个参数char *dst去掉
在函数内部申明char *dst
[/Quote]
去了也不行,一个样
cuixd2020 2009-03-13
  • 打赏
  • 举报
回复
答了给分
品茶 2009-03-13
  • 打赏
  • 举报
回复
将第二个参数char *dst去掉
在函数内部申明char *dst

65,210

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧