fopen()的非ASCII文件名

时间:2018-11-10 15:33:47

标签: c file character-encoding ascii cross-platform

我需要一个健壮的跨平台解决方案来读取C中的特定二进制文件。假设我要fopen()这样(可能很大)的文件,分配一个临时缓冲区,然后fread()字节序列 更新我的SHA1_CTX,最后关闭我的文件,完成sha1并继续。很琐碎,对吧?

但是,有一件事我怀疑:如果文件名不是ASCII怎么办? 假设我将拥有:

  • /Users/me/Projects/my_file.bin
  • /home/me/файлы/работа/мой_файл.bin
  • С:\\我的檔案\\我的工作.bin
  • D:\\Folder\\.bin

fopen可以处理此类路径吗?如果没有,我该怎么办?我可能会编写一些特定于平台的代码或寻找一些跨平台的库,但是对我的应用程序来说,尽可能的小是极其重要的,而且它是用C编写的,因此QT,Boost等不适用。

谢谢。

2 个答案:

答案 0 :(得分:2)

在Windows以外的几乎所有平台上,都希望将文件名作为标准的char[]字符串传递给标准函数,这些字符串以所使用的语言环境的字符编码表示,并且在所有将是UTF的现代系统上-8。您可以:

  • 通过确保您调用setlocale(LC_ALL,"")(或如果您不想使用其他语言环境功能,则为setlocale(LC_CTYPE,""))并将所有本地文本输入和输出视为采用任何编码方式,来兑现这一点(使用户满意,但当UTF-8中的某些外部输入(例如,来自网络的输入)无法表示时,可能会带来麻烦,或者
  • 总是在UTF-8中工作,并且希望将UTF-8字符串传递给文件系统访问函数,因为它们是抽象字节数组。

不幸的是,这些都不在Windows上起作用,但是will work in the near future上却起作用。如果您使用Cygwinmidipix来构建应用程序,它也可以工作。除此之外,您还需要垫片才能使它们在Windows上正常运行,这是一个巨大的痛苦。

答案 1 :(得分:0)

特定于操作系统和特定于文件系统。

您可能不知道文件路径使用什么编码。程序的用户应该知道这一点。

但是,在2018年,UTF-8 tend to be used everywhere。实际上,今天并非总是如此(尤其是在Windows上)。

顺便说一句,不同的操作系统对文件路径有不同的限制。原则上,在Linux上,您可以拥有一个仅包含一个选项卡和一个返回字符的文件名(当然,它的味道很差,实际上没有人这样做;有关详细信息,请阅读path_resolution(7))。在Windows上,这是不允许的。

  

fopen可以处理此类路径吗?

是的。 C11标准(有关详细信息,请阅读n1570)不涉及字符编码。

一个不同的问题是您的特定实现对此类路径做了什么。邪恶在于细节,它们可能很难看。