如何在Windows上打开UNICODE文件名的文件?

如何在Windows上打开UNICODE文件名的文件?,unicode,fopen,Unicode,Fopen,第三个库只接受char*文件名,例如3rdlib\u func\u name(char*file\u name)。当我用中文或日文提供文件名时,一切都会出错 有没有办法让这个库打开UNICODE文件名?该程序正在Windows上运行 谢谢您的回复。不,除非您可以从修改过的源代码重新编译它(一项重大任务),否则没有。您可能会更幸运地输入第三方库的短文件名,如AHDF76~4.DOC;这些文件名使用ASCII。请参阅。您可以尝试将字符串转换为本地代码页: setlocale(LC_ALL,"Japa

第三个库只接受char*文件名,例如
3rdlib\u func\u name(char*file\u name)
。当我用中文或日文提供文件名时,一切都会出错

有没有办法让这个库打开UNICODE文件名?该程序正在Windows上运行


谢谢您的回复。

不,除非您可以从修改过的源代码重新编译它(一项重大任务),否则没有。您可能会更幸运地输入第三方库的短文件名,如
AHDF76~4.DOC
;这些文件名使用ASCII。请参阅。

您可以尝试将字符串转换为本地代码页:

setlocale(LC_ALL,"Japanese_Japan.932");
std::string file_name = convert_to_codepage_932(utf16_file_name);
3rdlib_func_name(file_name.c_str());
否则呢


责怪windows不支持UTF-8

我们也有类似的问题。幸运的是,有一个解决方案,尽管有点棘手

如果文件/目录已经存在-您可以使用
GetShortPathName
功能。生成的“短”路径名保证不包含非拉丁字符

  • 调用
    GetShortPathNameW
    (unicode版本)以获取“短”路径字符串
  • 将短路径转换为ANSI字符串(使用
    WideCharToMultiByte
  • 将生成的ANSI字符串提供给愚蠢的第三方库

  • 现在,如果文件/目录还不存在-您可能无法获得其短路径名。在这种情况下,您应该首先创建它。

    返回到第三方作者处。该库可能支持UTF-8文件名,您无法通过查看函数定义立即判断(
    char*
    可以是ASCII,也可以是UTF-8)。我假设库在内部使用
    fopen
    ,在*nix上确实支持UTF-8文件名,而在Windows上则不支持(您需要使用特定于平台的
    \u wfopen
    )。谢谢您的回复。我的计算机上当前使用的Windows ANSI代码页是1252(从GetACP检索)。我尝试了3个代码页CP_ACP、CP_UTF8和936(简体中文代码页)来调用WideCharToMultiByte将UNICODE中文文件名更改为多字节文件名。3rdlib_func_名称返回所有这3个多字节文件名的“未找到文件”。注意。不支持将CP_UTF8作为文件系统代码页。我建议只使用fopen运行测试,然后使用第三部分库。如果没有帮助,请停止使用Windows。老实说,我的家用电脑在Ubuntu上运行,但我在Windows上工作:)我试过fopen,它也不工作。@zengkun100这是已知的Windows问题。在打开文件时,您几乎在任何地方都会遇到这样的问题,而且该库最初不是为Windows和UTF-16支持而开发的。谢谢!我试过这个很棒的GetShortPathName。它有时确实有效,但不是一直有效:)谢谢,我已经尝试过这个解决方案。它不能100%工作:(我们今天下午给lib供应商打了电话。我非常希望能够在Windows7下使用PHP访问GetShortPathName resp.unicode命名文件。。。