【问题标题】:How can I convert a Unicode path to a c string?如何将 Unicode 路径转换为 ​​c 字符串?
【发布时间】:2010-06-01 17:11:16
【问题描述】:

如何从 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);

【问题讨论】:

    标签: c winapi


    【解决方案1】:

    GetShortPathName()函数

    http://msdn.microsoft.com/en-us/library/aa364989%28VS.85%29.aspx

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

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

    有关设置,请参阅http://technet.microsoft.com/en-us/library/cc781607%28WS.10%29.aspx。这里有一个共识(见下文),这个案例是可以忽略的。

    感谢大家,白痴对这篇文章的贡献。

    【讨论】:

    • 但是短路径不也是LPWSTR吗?也许 OP 正在寻找 WideCharToMultiByte 之类的东西?
    • 我实际上正在寻找两者的结合。
    • @metafex:也许你应该编辑你的问题。这是公认的答案似乎没有意义,问题是它目前是什么。
    • @moron 不,8.3 路径保证仅为 ASCII,每字节 7 位
    • @metafex 其实你应该可以调用 ASCII 版本的。 LPCTSTR 类型不是根据 UNICODE(或者是 _UNICODE?)宏解析为“const char *”还是“const wchar *”。在这种情况下,该函数通常具有 ASCII 和 WIDE 版本,在本例中为 GetShortPathNameA 和 GetShortPathNameW。您会发现 GetShortPathName 只是根据 UNICODE 宏定义到其中之一的宏。如果您想要 ASCII 版本,即使定义了 UNICODE(默认情况下也是如此),请使用 ASCII 字符串调用 GetShortPathNameA。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多