![](/img/trans.png)
[英]Why use fopen() mode 'b' (stdio.h) when output can be non-ASCII regardless?
[英]Non-ascii filename for fopen()
我需要一個健壯的跨平台解決方案來讀取C中的特定二進制文件。假設我要fopen()這樣的(可能很大)文件,分配一個臨時緩沖區,然后fread()一個字節序列來更新我的SHA1_CTX最后關閉我的文件,完成sha1並繼續。 很瑣碎,對不對?
但是,有一件事我懷疑:如果文件名不是ASCII怎么辦? 假設我將擁有:
/Users/me/Projects/my_file.bin
/home/me/файлы/работа/мой_файл.bin
С:\\\\我的檔案\\\\我的工作.bin
D:\\\\Folder🙈\\\\🙂👍😘.bin
fopen可以處理這樣的路徑嗎? 如果沒有,我該怎么辦? 我可能會編寫一些特定於平台的代碼或尋找一些跨平台的庫,但是對我的應用程序來說,盡可能的小是極其重要的,而且它是用C編寫的,因此QT,Boost等不適用。 。
謝謝。
在Windows以外的幾乎所有平台上,都希望將文件名作為普通char[]
字符串傳遞給標准函數,這些字符串以所使用的語言環境的字符編碼表示,並且在所有將UTF-8轉換的現代系統上。 您可以:
setlocale(LC_ALL,"")
(或如果不想使用其他語言環境功能,請調用setlocale(LC_ALL,"")
setlocale(LC_CTYPE,"")
),並將所有本地文本輸入和輸出視為采用哪種編碼方式(當用戶無法表示UTF-8中的某些外部輸入(例如,來自網絡的輸入)時,使用戶感到高興,但可能會麻煩,或者 不幸的是,這一切都無法在Windows上運行,但不久之后它將可以使用 。 如果您使用Cygwin或midipix來構建應用程序,它也可以使用。 除此之外,您還需要墊片才能使它們在Windows上正常運行,這是一個巨大的痛苦。
它是特定於操作系統和特定於文件系統的。
您可能不知道文件路徑使用哪種編碼。 程序的用戶應該知道這一點。
但是,在2018年, UTF-8傾向於在任何地方使用 。 實際上,今天並非總是如此(特別是在Windows上)。
順便說一句,不同的操作系統對文件路徑有不同的限制。 原則上,在Linux上,您可以擁有一個僅包含一個制表符和一個返回字符的文件名(當然,它的味道很差,實際上沒有人這樣做;有關詳細信息,請閱讀path_resolution(7) )。 在Windows上,這是不允許的。
fopen可以處理這樣的路徑嗎?
是。 C11標准(有關詳細信息,請閱讀n1570 )不涉及字符編碼。
一個不同的問題是您的特定實現對此類路徑做了什么。 邪惡在於細節,它們可能是丑陋的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.