代码之家  ›  专栏  ›  技术社区  ›  Brian R. Bondy

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

  •  14
  • Brian R. Bondy  · 技术社区  · 17 年前

    有没有一个标准的方法来做一个测试 fopen 使用Unicode字符串文件路径?

    3 回复  |  直到 5 年前
        1
  •  19
  •   Deduplicator    5 年前

    Linux

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

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

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

    窗户

    使用当前的代码页,不管是什么(UTF-8刚刚成为一个选项)。许多C库函数都有接受UTF-16的非标准等效函数( wchar_t 在Windows上)。例如 _wfopen 而不是 .

        2
  •  17
  •   rob    17 年前

    forum ) MSDN ).

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

        3
  •  4
  •   TokenMacGuy    17 年前

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

    文件路径的编码通常在系统范围内设置,因此如果您的文件路径不在系统的区域设置中,则可能需要通过 iconv 图书馆

        4
  •  0
  •   phuclv    5 年前

    现在几乎所有POSIX平台都使用UTF-8。还有现代的窗户 support UTF-8 as the locale fopen 只是可以随身携带

    从Windows 10 build 17134(2018年4月更新)开始,Universal C运行时支持使用UTF-8代码页。这意味着传递给C运行时函数的字符字符串将使用UTF-8编码。要启用UTF-8模式,请在使用setlocale时使用“.UTF8”作为代码页。例如,setlocale(LC_ALL,“.UTF8”)将使用当前默认的Windows ANSI代码页(ACP)作为区域设置,使用UTF-8作为代码页。

    ...

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

    UTF-8 Support