提问人:Brian R. Bondy 提问时间:12/29/2008 最后编辑:phuclvBrian R. Bondy 更新时间:9/2/2022 访问量:17586
有没有一种标准方法可以使用 Unicode 字符串文件路径执行 fopen?
Is there a standard way to do an fopen with a Unicode string file path?
答:
这与您当前的区域设置有关。在我的系统上,它启用了 Unicode,文件路径将采用 Unicode。我能够通过locale命令检测到这一点:
$ locale
LANG=en_US.UTF-8
LC_CTYPE="en_US.UTF-8"
文件路径的编码通常是在系统范围内设置的,因此,如果您的文件路径不在系统的区域设置中,则需要对其进行转换,也许可以通过 iconv 库进行转换。
在 *nix 中,您只需使用标准(请参阅 TokeMacGuy 的回复或在此论坛中的更多信息)
在 Windows 中,您可以使用 ,然后传递 Unicode 字符串(有关详细信息,请参阅 MSDN)。fopen
_wfopen
由于没有真正的通用方法,我会将此调用与所有其他与系统相关的函数一起包装在宏中。
不,没有标准方法。操作系统之间存在一些差异。以下是不同操作系统处理非 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
而不是 .fopen
wchar_t
fopen
现在几乎所有的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"
setlocale
setlocale(LC_ALL, ".UTF8")
...
若要在 Windows 10 之前的操作系统(如 Windows 7)上使用此功能,必须使用应用本地部署或使用 Windows SDK 版本 17134 或更高版本静态链接。对于 17134 之前的 Windows 10 操作系统,仅支持静态链接。
下一个:程序启动时出错
评论