我需要一个健壮的跨平台解决方案来读取C中的特定二进制文件。假设我要fopen()这样(可能很大)的文件,分配一个临时缓冲区,然后fread()字节序列 更新我的SHA1_CTX,最后关闭我的文件,完成sha1并继续。很琐碎,对吧?
但是,有一件事我怀疑:如果文件名不是ASCII怎么办? 假设我将拥有:
/Users/me/Projects/my_file.bin
/home/me/файлы/работа/мой_файл.bin
С:\\我的檔案\\我的工作.bin
D:\\Folder\\.bin
fopen可以处理此类路径吗?如果没有,我该怎么办?我可能会编写一些特定于平台的代码或寻找一些跨平台的库,但是对我的应用程序来说,尽可能的小是极其重要的,而且它是用C编写的,因此QT,Boost等不适用。
谢谢。
答案 0 :(得分:2)
在Windows以外的几乎所有平台上,都希望将文件名作为标准的char[]
字符串传递给标准函数,这些字符串以所使用的语言环境的字符编码表示,并且在所有将是UTF的现代系统上-8。您可以:
setlocale(LC_ALL,"")
(或如果您不想使用其他语言环境功能,则为setlocale(LC_CTYPE,"")
)并将所有本地文本输入和输出视为采用任何编码方式,来兑现这一点(使用户满意,但当UTF-8中的某些外部输入(例如,来自网络的输入)无法表示时,可能会带来麻烦,或者不幸的是,这些都不在Windows上起作用,但是will work in the near future上却起作用。如果您使用Cygwin或midipix来构建应用程序,它也可以工作。除此之外,您还需要垫片才能使它们在Windows上正常运行,这是一个巨大的痛苦。
答案 1 :(得分:0)
特定于操作系统和特定于文件系统。
您可能不知道文件路径使用什么编码。程序的用户应该知道这一点。
但是,在2018年,UTF-8 tend to be used everywhere。实际上,今天并非总是如此(尤其是在Windows上)。
顺便说一句,不同的操作系统对文件路径有不同的限制。原则上,在Linux上,您可以拥有一个仅包含一个选项卡和一个返回字符的文件名(当然,它的味道很差,实际上没有人这样做;有关详细信息,请阅读path_resolution(7))。在Windows上,这是不允许的。
fopen可以处理此类路径吗?
是的。 C11标准(有关详细信息,请阅读n1570)不涉及字符编码。
一个不同的问题是您的特定实现对此类路径做了什么。邪恶在于细节,它们可能很难看。