很多时候,这个问题已被提出,而且答案很多 - 这些问题对我和其他许多人来说都不起作用。问题是关于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的签名,它是一个库函数。
答案 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时,请坚持CString
和wchar_t
。
如果您需要将数据上传到网页或其他内容,请使用CW2A
和CA2W
进行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);