我使用下一种类型的字符串: LPCSTR、TCHAR、我想转换的字符串:
我通过该代码从TCHAR转换为LPCSTR:
RunPath = TEXT("C:\\1");
LPCSTR Path = (LPCSTR)RunPath;从字符串到字符,我通过该代码进行转换:
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);我的问题是,当我在“使用多字节字符集”中设置“配置属性->通用字符集”时,代码的第一部分工作正常。但是第二部分代码返回错误C2440。当我在“使用Unicode”中设置“配置属性->通用字符集”时,第二部分代码正确工作。但是代码的第一部分将唯一的第一个字符从TCHAR返回到LPCSTR。
发布于 2010-03-16 06:16:32
我建议你要全程使用Unicode。
LPCSTR是一个“指向C类型字符串的长指针”。在处理.Net方法时,这通常不是您想要的。.Net中的char类型为16位宽。
您也不应该使用文本(“”)宏,除非您正在计划使用各种字符编码的多个构建。如果可以,尝试用_W("")宏和纯unicode构建包装所有字符串文字。
看看这是否有帮助。
PS。在您的场景中,std::wstring非常方便。
编辑
您只看到一个字符,因为字符串现在是unicode,但是您将其转换为常规字符串。ASCII范围中的许多或大多数Unicode字符的编号与ASCII中相同,但其2个字节中的第二个设置为零。因此,当unicode字符串被读取为C-字符串时,您只会看到第一个字符,因为C-字符串为null (零)终止。处理这个问题的简单方法(也是错误的)是使用std:wstring将其转换为std:string,然后将C-字符串从其中提取出来。这不是一种安全的方法,因为Unicode比标准编码有更大的字符空间。
https://stackoverflow.com/questions/2452073
复制相似问题