如何将Unicode路径转换为c字符串?

如何将Unicode路径转换为c字符串?,c,winapi,C,Winapi,如何将Unicode路径名(LPWSTR)转换为等效的ASCII?被调用的库只理解c字符串 编辑: 好的,我使用GetShortPathName和WideCharToMultiByte建议创建了这段代码,我用路径中包含Unicode字符的一些文件夹对其进行了测试,它工作得非常完美: wlength = GetShortPathNameW(cpy,0,0); LPWSTR shortp = (LPWSTR)calloc(wlength,sizeof(WCHAR)); GetShortPathNam

如何将Unicode路径名(LPWSTR)转换为等效的ASCII?被调用的库只理解c字符串

编辑: 好的,我使用GetShortPathName和WideCharToMultiByte建议创建了这段代码,我用路径中包含Unicode字符的一些文件夹对其进行了测试,它工作得非常完美:

wlength = GetShortPathNameW(cpy,0,0);
LPWSTR shortp = (LPWSTR)calloc(wlength,sizeof(WCHAR));
GetShortPathNameW(cpy,shortp,wlength);
clength = WideCharToMultiByte(CP_OEMCP, WC_NO_BEST_FIT_CHARS, shortp, wlength, 0, 0, 0, 0);
LPSTR cpath = (LPSTR)calloc(clength,sizeof(CHAR));
WideCharToMultiByte(CP_OEMCP, WC_NO_BEST_FIT_CHARS, shortp, wlength, cpath, clength, 0, 0);
GetShortPathName()
函数

将为您提供一个等效的8.3文件名,指向同一个文件,用于遗留代码

[编辑]这可能是您能做的最好的,尽管理论上8.3文件名可能包含非ascii字符,这取决于注册表设置。在这种情况下,您没有简单的方法获取正确的char*,如果文件创建期间的代码页设置与当前设置不匹配,GetShortPathNameA()也不会这样做

请参阅有关设置的信息。这里有一种共识(见下文),认为忽视这个案例是合理的


感谢所有白痴对这篇文章的贡献。

但是短路径LPWSTR不也是吗?也许OP在寻找WideCharToMultiByte之类的东西?我实际上在寻找这两者的组合。@metafex:也许你应该编辑你的问题。这是公认的答案似乎没有意义,问题是它目前是什么。@moron否,8.3路径保证仅为ASCII,7位/秒byte@metafex实际上,您应该能够调用ASCII版本。LPCTSTR类型不是根据UNICODE(或者是UNICODE?)宏解析为“const char*”还是“const wchar*”。在这种情况下,函数通常具有ASCII和宽版本,在本例中为GetShortPathNameA和GetShortPathNameW。您会发现GetShortPathName只是一个根据UNICODE宏定义的宏。如果您想要ASCII版本,即使定义了UNICODE(默认情况下是这样),请使用ASCII字符串调用GetShortPathNameA。