And*_*uri 11 c++ windows string
新版本的如何从转换典型的问题std::string
来LPCTSTR
.
从不同的SO帖子中读到我了解到我应该这样做:
CreateDirectory(path.c_str(),NULL);
Run Code Online (Sandbox Code Playgroud)
而且编译器仍然会出错cannot convert from const char * to LPCTSTR
.
我试过了:
CreateDirectory((LPCTSTR)path.c_str(),NULL);
Run Code Online (Sandbox Code Playgroud)
没错!
仍然创建目录(在正确的位置):
D:\\something\\????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)
这不完全是我想要的,你可以猜到......
那我错过了什么?它与UNICODE/ANSI有关吗?我该如何解决这个问题?
这里的问题LPCTSTR
是解决wchar_t*
或char*
基于您的构建是否支持unicode(unicode标志设置与否)的事实.
要显式调用该char*
版本,请调用CreateDirectoryA()
.
当你试图找到"(std::)字符串到LPCTSTR"时弹出这个问题
这里有一个方法如何转换和传递std::string
的LPCTSTR
使用wstring
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);
Run Code Online (Sandbox Code Playgroud)
重要说明由阿德里安·麦卡锡:
如果源字符串是ASCII或者它是ANSI并且当前代码页是Windows-1252(非常类似于Latin-1),则这很好.如果源是UTF-8或其他代码页,那么这只是隐藏了问题.
试着看看这个页面:什么是TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc . 如果您使用的是MSVC,那么您可能已为项目设置了Unicode LPCSTR
并被"翻译"为const wchar_t *
,这与之不兼容const char *
通过这样做:(LPCTSTR)path.c_str()
你从原始字符串中取出两个字符,并从中创建一个unicode wchar_t字母.多数民众赞成你获得"中国"字符的方式.
您正在编译Unicode,这意味着它CreateDirectory
是CreateDirectoryW
宽字符版本的别名.但是,程序中的文本使用ANSI进行编码.这意味着您的程序无法正确处理国际化.
编译器告诉您CreateDirectoryW
所需的文本编码与您提供的文本编码之间存在不匹配.确实,您可以调用CreateDirectoryA
以解决该不匹配问题,但这只会使根问题永久化,即您在程序中使用ANSI文本这一事实.
因此,最好的解决方案是将所有文本编码为Unicode.停止使用string
并开始使用wstring
.一旦你改变path
到wstring
那时
CreateDirectory(path.c_str(),NULL);
Run Code Online (Sandbox Code Playgroud)
是正确的.