2010-04-28 76 views
2

有一个第三个lib只接受char *文件名,例如3rdlib_func_name(char* file_name)。当我用中文或日文提供文件名时,每件事都会出错。如何在Windows上使用UNICODE文件名打开文件?

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

感谢您的回复。

+0

回到第三方作者。 – 2010-04-28 13:34:35

+0

该库可能支持UTF-8文件名,您只能通过查看函数定义('char *'可能是ASCII,或者它可能是UTF-8)无法立即得知。我假设库在内部使用'fopen',它在* nix上支持UTF-8文件名,而在Windows上则不支持(您需要使用平台特定的'_wfopen')。 – 2015-09-10 13:45:18

回答

4

我们也有类似的问题太多。幸运的是有一个解决方案,虽然它有点棘手。

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

  1. 请致电GetShortPathNameW(unicode版本)获取“short”路径字符串。
  2. 将短路径转换为ANSI字符串(使用WideCharToMultiByte)。
  3. 将生成的ANSI字符串提供给愚蠢的第三方库。

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

+0

谢谢,我已经试过这个解决方案。它不百分之百的工作:(我们今天下午称lib库供应商。 – zengkun100 2010-04-29 14:04:12

+0

我很喜欢在Windows7下使用PHP访问GetShortPathName和unicode命名的文件... – 2012-05-06 13:58:30

1

不,除非您可以从修改过的源文件重新编译它(一项主要工作)否则不会有。您可能有更好的运气提供第三方库短文件名,如AHDF76~4.DOC;这些文件名使用ASCII。见GetShortPathName

+0

谢谢! 我已经尝试了这个真棒GetShortPathName。它有时会工作,但不是所有的时间:) – zengkun100 2010-04-29 02:25:32

0

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

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

否则?

责备窗户不支持UTF-8 ;-)

+0

感谢您的回复。 我的计算机上使用的当前Windows ANSI代码页是1252(从GetACP中检索)。我已经尝试了3个代码页CP_ACP,CP_UTF8和936(简体中文代码页)来调用WideCharToMultiByte将UNICODE中文文件名更改为多字节文件名。 3rdlib_func_name返回所有这3个多字节文件名的“文件未找到”。 – zengkun100 2010-04-29 01:57:33

+0

注意。 CP_UTF8不支持作为文件系统代码页。我建议只用fopen运行测试,然后用第三方库运行测试。 如果不能停止使用Windows';-)'。 – Artyom 2010-04-29 04:20:54

+0

说实话,我的家用电脑在Ubuntu上运行,但我在Windows上工作:)我试过fopen,但它也不起作用。 – zengkun100 2010-04-29 14:06:30

相关问题