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

Bri*_*ndy 15 c++ unicode fopen

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

rob*_*rob 13

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

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


nwe*_*hof 12

不,没有标准的方法.操作系统之间存在一些差异.以下是不同操作系统处理非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的非标准等价物(wchar_t在Windows上).例如,_wfopen而不是fopen.