Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/130.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否有一种标准的方法来使用unicode字符串文件路径进行fopen?_C++_Unicode_Fopen - Fatal编程技术网

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

C++ 是否有一种标准的方法来使用unicode字符串文件路径进行fopen?,c++,unicode,fopen,C++,Unicode,Fopen,是否有一种标准的方法可以使用unicode字符串文件路径进行fopen?这是您当前的语言环境问题。在启用unicode的系统上,文件路径将使用unicode。我可以通过locale命令检测到这一点: $ locale LANG=en_US.UTF-8 LC_CTYPE="en_US.UTF-8" 文件路径的编码通常在系统范围内设置,因此如果文件路径不在系统的区域设置中,则可能需要通过库对其进行转换 在*nix中,您只需使用标准的fopen(请参阅TokeMacGuy回复中的更多信息,或在本文中

是否有一种标准的方法可以使用unicode字符串文件路径进行fopen?

这是您当前的语言环境问题。在启用unicode的系统上,文件路径将使用unicode。我可以通过locale命令检测到这一点:

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

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

在*nix中,您只需使用标准的fopen(请参阅TokeMacGuy回复中的更多信息,或在本文中) 在windows中,可以使用wfopen,然后传递unicode字符串(有关详细信息,请参阅)


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

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

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

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

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

窗户 Windows API使用UTF-16作为文件名,但
fopen
仅支持ASCII。许多C库函数都有一个接受UTF-16的非标准等效函数(
wchar\u t
在Windows上)。例如,而不是
fopen