有没有一种标准方法可以使用 Unicode 字符串文件路径执行 fopen?

Is there a standard way to do an fopen with a Unicode string file path?

提问人:Brian R. Bondy 提问时间:12/29/2008 最后编辑:phuclvBrian R. Bondy 更新时间:9/2/2022 访问量:17586

问:

有没有标准方法可以对 Unicode 字符串文件路径进行操作?fopen

C Unicode fopen

评论


答:

4赞 TokenMacGuy 12/29/2008 #1

这与您当前的区域设置有关。在我的系统上,它启用了 Unicode,文件路径将采用 Unicode。我能够通过locale命令检测到这一点:

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

文件路径的编码通常是在系统范围内设置的,因此,如果您的文件路径不在系统的区域设置中,则需要对其进行转换,也许可以通过 iconv 库进行转换。

17赞 rob 12/29/2008 #2

在 *nix 中,您只需使用标准(请参阅 TokeMacGuy 的回复或在此论坛中的更多信息)
在 Windows 中,您可以使用 ,然后传递 Unicode 字符串(有关详细信息,请参阅 MSDN)。
fopen_wfopen

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

23赞 nwellnhof 1/28/2016 #3

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

Linux操作系统

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

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

OS X

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

窗户

Windows API 使用 UTF-16 作为文件名,但使用当前的代码页,无论它是什么(UTF-8 刚刚成为一个选项)。许多 C 库函数都具有接受 UTF-16(在 Windows 上)的非标准等效项。例如,_wfopen 而不是 .fopenwchar_tfopen

1赞 phuclv 7/25/2021 #4

现在几乎所有的POSIX平台都使用UTF-8。现代 Windows 也支持 UTF-8 作为语言环境,您可以在任何地方使用 UTF-8 并打开任何文件,而无需在 Windows 上使用宽字符串。 只是便携地工作fopen

setlocale(LC_ALL, "en_us.utf8"); // need some setup before calling this
fopen(R"(C:\filê\wíth\Ünicode\name.txt)", "w+");

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

...

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

UTF-8 支持