我使用下一种字符串: LPCSTR,TCHAR,我要转换的字符串:
我通过该代码从TCHAR转换为LPCSTR:
RunPath = TEXT("C:\\1");
LPCSTR Path = (LPCSTR)RunPath;
从String转换为char,转换为该代码:
SaveFileDialog^ saveFileDialog1 = gcnew SaveFileDialog;
saveFileDialog1->Title = "Сохранение файла-настроек";
saveFileDialog1->Filter = "bck files (*.bck)|*.bck";
saveFileDialog1->RestoreDirectory = true;
pin_ptr<const wchar_t> wch = TEXT("");
if ( saveFileDialog1->ShowDialog() == System::Windows::Forms::DialogResult::OK ) {
wch = PtrToStringChars(saveFileDialog1->FileName);
} else return;
ofstream os(wch, ios::binary);
我的问题是,当我设置“配置属性 - &gt;常规 “使用多字节字符集”中的字符集代码的第一部分正常工作。但代码的第二部分返回错误C2440。当我设置“配置属性 - &gt;常规 “使用Unicode”中的字符集第二部分代码正常工作。但是代码的第一部分将唯一的第一个字符从TCHAR返回到LPCSTR。
答案 0 :(得分:1)
我建议你需要在整个过程中使用Unicode。
LPCSTR是“指向C类型字符串的长指针”。当你处理.Net方法时,这通常不是你想要的。 .Net中的 char 类型为16位宽。
除非您使用各种字符编码规划多个构建,否则您也不应使用 TEXT(“”)宏。尝试使用_W(“”)宏包装所有字符串文字,如果可以,请尝试使用纯unicode构建。
看看是否有帮助。
PS。 std::wstring在您的方案中非常方便。
修改强>
您只看到一个字符,因为该字符串现在是unicode,但您将其转换为常规字符串。 ASCII范围中的许多或大多数Unicode字符具有与ASCII相同的编号,但将其2个字节中的第二个设置为零。因此,当unicode字符串作为C字符串读取时,您只能看到第一个字符,因为C字符串为空(零)终止。 easy (和错误)处理这个问题的方法是使用std:wstring作为std:string进行转换,然后从中拉出C-String。这不是安全的方法,因为Unicode比标准编码具有更大的字符空间。