有没有一种标准的方法来使用unicode字符串文件路径进行fopen?

时间:2008-12-28 19:34:36

标签: c++ unicode fopen

有没有一种标准的方法来使用unicode字符串文件路径进行fopen?

4 个答案:

答案 0 :(得分:12)

在* nix中,您只需使用标准fopen(请参阅TokeMacGuy或此forum的回复中的更多信息) 在Windows中,您可以使用_wfopen,然后传递一个unicode字符串(有关更多信息,请参阅MSDN)。

由于没有真正的通用方法,我会将此调用与所有其他依赖于系统的函数一起包装在宏中。

答案 1 :(得分:10)

不,没有标准的方法。操作系统之间存在一些差异。以下是不同操作系统处理非ASCII文件名的方法。

的Linux

在Linux下,文件名只是一个二进制字符串。大多数现代发行版的惯例是将UTF-8用于非ASCII文件名。但在开始时,将文件名编码为ISO-8559-1是很常见的。基本上由每个应用程序来选择编码,因此您甚至可以在同一文件系统上使用不同的编码。 LANG环境变量可以提示您首选编码是什么。但是现在,你可以在任何地方假设UTF-8。

但这并非没有问题,因为包含无效UTF-8序列的文件名在大多数Linux文件系统上都是完全有效的。如果你只支持UTF-8,你会如何指定这样的文件名?理想情况下,您应该同时支持UTF-8和二进制文件名。

OS X

OS X上的HFS文件系统在内部使用Unicode(UTF-16)文件名。大多数C(和POSIX)库函数(如fopen)接受UTF-8字符串(因为它们是8位兼容的)并在内部进行转换。

Windows API使用UTF-16作为文件名,但fopen仅支持ASCII。许多C库函数都有一个非标准的等价物,它接受UTF-16(Windows上的wchar_t)。例如,_wfopen而不是fopen

答案 2 :(得分:4)

这是您当前的区域设置问题。在我的系统上,启用了unicode,文件路径将是unicode。我能够通过locale命令检测到这一点:

$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"

文件路径的编码通常在系统范围内设置,因此如果您的文件路径不在系统的语言环境中,则需要通过iconv库进行转换。

答案 3 :(得分:0)

现在几乎所有 POSIX 平台都使用 UTF-8。现代 Windows 也support UTF-8 as the locale,您可以在任何地方使用 UTF-8 并打开任何文件,而无需在 Windows 上使用宽字符串。 fopen 只是便携

<块引用>

从 Windows 10 内部版本 17134(2018 年 4 月更新)开始,通用 C 运行时支持使用 UTF-8 代码页。这意味着传递给 C 运行时函数的字符字符串将需要 UTF-8 编码的字符串。要启用 UTF-8 模式,请在使用 setlocale 时使用“.UTF8”作为代码页。例如,setlocale(LC_ALL, ".UTF8") 将使用当前默认的 Windows ANSI 代码页 (ACP) 作为语言环境,使用 UTF-8 作为代码页。

...

要在 Windows 10 之前的操作系统(例如 Windows 7)上使用此功能,您必须使用应用本地部署或使用 Windows SDK 17134 版或更高版本静态链接。对于 17134 之前的 Windows 10 操作系统,仅支持静态链接。

UTF-8 Support