C++ 是否有一种标准的方法来使用unicode字符串文件路径进行fopen?
是否有一种标准的方法可以使用unicode字符串文件路径进行fopen?这是您当前的语言环境问题。在启用unicode的系统上,文件路径将使用unicode。我可以通过locale命令检测到这一点: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回复中的更多信息,或在本文中
$ 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