std :: string到LPCTSTR

如何从std::string转换为LPCTSTR的典型问题的新版本。

从不同的SOpost阅读,我了解到,我应该这样做:

 CreateDirectory(path.c_str(),NULL); 

而编译器仍然给出错误,因为cannot convert from const char * to LPCTSTR

我试过了:

 CreateDirectory((LPCTSTR)path.c_str(),NULL); 

没有错误!

仍然创build的目录(在正确的位置)被称为:

 D:\\something\\㩄ぜ弲久䅓余屓䱆彄湡敤屲䵉ⴱ㠶ⴰⵃㅇ㉜洰⵭就䥄牃獥汵獴촀췍췍췍췍췍췍췍﷍﷽꯽ꮫꮫꮫﺫﻮﻮ 

这不正是我想要的,你可以猜测…

那么我错过了什么? 这与UNICODE / ANSI有关吗? 我该如何解决这个问题?

Solutions Collecting From Web of "std :: string到LPCTSTR"

这里的问题是LPCTSTR根据您的版本是否支持unicode(unicode标志设置与否)解析为wchar_t*char*

要显式调用char*版本,请调用CreateDirectoryA()

尝试看看这个网页: http : //www.codeproject.com/Articles/76252/What-are-TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc 。 如果你正在使用MSVC,比你可能已经为项目设置了Unicode,LPCSTR被“翻译”为常量wchar_t *,它与const char *

通过这样做: (LPCTSTR)path.c_str()你从原始字符串中取两个字符,并从它们中创建一个Unicode字符wchar_t。 这就是你得到“中国”字符。

您正在编译Unicode,这意味着CreateDirectoryCreateDirectoryW (宽字符版本)的别名。 但是,您的程序中的文本使用ANSI编码。 这意味着您的程序无法正确处理国际化。

编译器告诉你CreateDirectoryW需要的文本编码和你提供的文本编码之间不匹配。 确实,您可以调用`CreateDirectoryA来解决这个错误匹配问题,但这只会延续根本问题,即在程序中使用ANSI文本。

所以,最好的解决方案是开始将所有的文本编码为Unicode。 停止使用string并开始使用wstring 。 一旦你改变pathwstring然后

 CreateDirectory(path.c_str(),NULL); 

是正确的。

当你试图找到“(std::)字符串到LPCTSTR”时弹出这个问题

这是一个如何使用wstringstd::string转换为LPCTSTR方法

 string path_str = "Yay!"; //your string containing path wstring path_wstr( path_str.begin(), path_str.end() ); //then this should work: CreateDirectory(path_wstr.c_str(),NULL); 

重要提示 Adrian McCarthy

这很好,如果源字符串是ASCII或如果它是ANSI和当前代码页是Windows-1252(这是非常类似于拉丁-1)。 如果源是UTF-8或其他代码页,那么这只是隐藏了问题。

改用CreateDirectoryACreateDirectory是根据构建配置展开为CreateDirectoryACreateDirectoryW的宏; 他们分别拿LPCSTRLPCWSTR 。 如果你知道你有一个LPCSTR (这是c_str()给你的),使用第一个。

其他解释是正确的:

像许多Window API一样,CreateDirectory实际上是一个扩展为“ANSI”或“Wide”版本的宏,取决于是否定义了UNICODE 。 ANSI版本有效地将单字节字符串转换为宽字符字符串,然后委托给宽字符字符串版本。

但是,直接调用CreateDirectoryA的建议有一些缺点:

由“ANSI”API完成的转换假定源字符串在用户的当前代码页中编码。 在简单情况下,这可能是真的。 但是在大量的现实生活中,事实并非如此。 所以你最终可能会得到错误的转换类型,这会导致你会在后面发现的错误。 至少不好的类型转换会导致你立即发现的错误。

更好的解决方案是在整个过程中使用宽字符串(std :: wstring),并调用CreateDirectoryW。 没有转换出错。 没有需要的类型转换。

对于许多代码库,重写所有使用宽字符串是不实际的。 事实证明,有充分的理由做相反的事情,并继续使用std :: strings,但标准化让他们保持UTF-8文本 。 然后,当你不得不调用一个Windows API的时候,你将(不是类型转换)转换为UTF-16,并直接调用API的宽版本。 这可以让你完全保真,只需要做一些转换和一些临时缓冲。 由于这些类型的电话很少出现在热点地区,所以成本通常不是什么大问题。

在Windows上,要在UTF-8和UTF-16之间进行转换,可以调用MultiByteToWideChar / WideCharToMultiByte,代码页设置为CP_UTF8。

我一直在努力。 经过相当多的挖掘,我发现这个作品是最好的; 你可以尝试以下方法:

 std::string t = "xyz"; CA2T wt (t.c_str());