首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >LPCSTR,TCHAR,String

LPCSTR,TCHAR,String
EN

Stack Overflow用户
提问于 2010-03-16 04:13:48
回答 1查看 4.5K关注 0票数 0

我使用下一种类型的字符串: LPCSTR、TCHAR、我想转换的字符串:

  1. 从TCHAR到LPCSTR
  2. 从字符串到字符

我通过该代码从TCHAR转换为LPCSTR:

代码语言:javascript
复制
RunPath = TEXT("C:\\1");
LPCSTR Path = (LPCSTR)RunPath;

从字符串到字符,我通过该代码进行转换:

代码语言:javascript
复制
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。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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比标准编码有更大的字符空间。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2452073

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档