LPCSTR,TCHAR,String

时间:2010-03-16 04:13:48

标签: string visual-c++

我使用下一种字符串: LPCSTR,TCHAR,我要转换的字符串:

  1. 从TCHAR到LPCSTR
  2. 从String到char
  3. 我通过该代码从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。

1 个答案:

答案 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比标准编码具有更大的字符空间。