【问题标题】:fopen with unicode filename带有 unicode 文件名的 fopen
【发布时间】:2014-01-28 10:16:24
【问题描述】:

我必须使用一个接受文件名作为字符串的库 (const char*)。内部文件使用fopen 打开。有没有办法让这个库接受 unicode 文件名?我可以使用WideCharToMultiByte 将 unicode 名称转换为 utf,然后再将它们传递给库吗?

一种可能的(不受欢迎的)解决方案是更改库接口 (char* -> wchar_t*) 并将 fopen 替换为特定于 Windows 的 _wopen。另一种解决方案是使用创建文件的符号链接并将其传递给库,但仅限于 NTFS 卷。

【问题讨论】:

  • 您不能使用WideCharToMultiByte 转换为UTF-8,因为Windows 的narrow-char 函数不支持UTF-8。它们仅支持本地编码(其中并非所有 Unicode 字符都可以表示)。将库界面更改为使用 wchar_t 是 Windows 上的典型操作。

标签: windows winapi visual-c++


【解决方案1】:

最好的方法是重写库......只是我的 2 美分。

但如果只是要打开现有文件,您可以使用GetShortPathName 你会发现一个关于这种方式的现有讨论here

【讨论】:

  • GetShortPathName 不暗示 ASCII 字符。也可以在特定卷上禁用短文件名别名。此外,GetShortPathName 在您无权查询父目录的情况下可能会失败。请参阅Short vs. Long Names 了解更多信息。
  • 我已经添加了一个帽子问题的链接和一个关于这个问题的讨论!我不是吗?
  • 您提供的链接中没有提到我描述的故障模式:系统无法查询父目录时检索短文件名失败。无需大惊小怪。
  • 我添加了两个链接!第二个解释失败和问题。第二个详细解释了如何在 8.3 短名称中防止 NTFS:NtfsAllowExtendedCharacterIn8dot3Name。那么又来了?我的回答遗漏了什么?
  • 这越来越乏味了:您提供的第二个链接没有说明我已经指出 两次 的故障模式:对 GetShortPathName 的调用可能失败 访问冲突,即使您对相关文件具有完全访问权限。
【解决方案2】:

使用 WideCharToMultiByte 您只能打开文件名仅包含 ANSI 字符的文件。这是因为文件函数的 ANSI 变体(使用“char *”类型参数)无法打开文件名中包含超过 255 个字符的文件。

使用 GetShortPathName 的缺点是它可能不适用于不支持“8.3”文件名的某些文件系统(可能是某些类型的网络驱动器)。

我会使用“_wfopen”函数重写库(“fopen”的 UNICODE 等效项是“_wfopen”,而不是“_wopen”)。

请注意,“fopen”的第二个参数在使用_wfopen时也必须是一个UNICODE字符串。

【讨论】:

    猜你喜欢
    • 2016-07-27
    • 1970-01-01
    • 2011-02-13
    • 1970-01-01
    • 2013-11-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多