将宽CString转换为char *

时间:2015-05-26 09:22:27

标签: c++ mfc char

很多时候,这个问题已被提出,而且答案很多 - 这些问题对我和其他许多人来说都不起作用。问题是关于MFC下广泛的CStrings和8bit字符。我们都想要一个适用于所有情况的答案,而不是特定的例子。

void Dosomething(CString csFileName)
{
    char cLocFileNamestr[1024];
    char cIntFileNamestr[1024];
    // Convert from whatever version of CString is supplied
    // to an 8 bit char string
    cIntFileNamestr = ConvertCStochar(csFileName);

    sprintf_s(cLocFileNamestr, "%s_%s", cIntFileNamestr, "pling.txt" );
    m_KFile = fopen(LocFileNamestr, "wt");
}

这是对现有代码(由其他人)的补充,用于调试。 我不想改变功能签名,它在很多地方使用。 我无法更改sprintf_s的签名,它是一个库函数。

2 个答案:

答案 0 :(得分:1)

你遗漏了很多细节,或者忽略了它们。如果您使用UNICODE定义(看起来是这样),那么转换为MBCS的最简单方法是这样的:

CStringA strAIntFileNameStr = csFileName.GetString(); // uses default code page

CStringA是CString的8位/ MBCS版本。

但是,如果您要翻译的unicode字符串包含不在默认代码页中的字符,它将填充一些乱码。

您可以使用fopen()代替使用_wfopen(),而swprintf_s()会打开一个带有unicode文件名的文件。要创建文件名,请使用{{1}}。

答案 1 :(得分:0)

  

一个适用于所有情况的答案,而不是特定的实例......

没有这样的事情。

"ABCD..." wchar_t*转换为char*很容易,但对于非拉丁语言则不行。

当您的项目是unicode时,请坚持CStringwchar_t

如果您需要将数据上传到网页或其他内容,请使用CW2ACA2W进行utf-8和utf-16转换。

CStringW unicode = L"Россия";
MessageBoxW(0,unicode,L"Russian",0);//should be okay

CStringA utf8 = CW2A(unicode, CP_UTF8);
::MessageBoxA(0,utf8,"format error",0);//WinApi doesn't get UTF-8

char buf[1024];
strcpy(buf, utf8);
::MessageBoxA(0,buf,"format error",0);//same problem

//send this buf to webpage or other utf-8 systems
//this should be compatible with notepad etc. 
//text will appear correctly
ofstream f(L"c:\\stuff\\okay.txt");
f.write(buf, strlen(buf));

//convert utf8 back to utf16
unicode = CA2W(buf, CP_UTF8);
::MessageBoxW(0,unicode,L"okay",0);