簡體   English   中英

fopen()的非ASCII文件名

[英]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中的某些外部輸入(例如,來自網絡的輸入)時,使用戶感到高興,但可能會麻煩,或者
  • 只能在UTF-8中使用,並且希望通過將UTF-8字符串傳遞給文件系統訪問函數來工作,因為它們是抽象字節數組。

不幸的是,這一切都無法在Windows上運行,但不久之后它將可以使用 如果您使用Cygwinmidipix來構建應用程序,它也可以使用。 除此之外,您還需要墊片才能使它們在Windows上正常運行,這是一個巨大的痛苦。

它是特定於操作系統和特定於文件系統的。

您可能不知道文件路徑使用哪種編碼。 程序的用戶應該知道這一點。

但是,在2018年, UTF-8傾向於在任何地方使用 實際上,今天並非總是如此(特別是在Windows上)。

順便說一句,不同的操作系統對文件路徑有不同的限制。 原則上,在Linux上,您可以擁有一個僅包含一個制表符和一個返回字符的文件名(當然,它的味道很差,實際上沒有人這樣做;有關詳細信息,請閱讀path_resolution(7) )。 在Windows上,這是不允許的。

fopen可以處理這樣的路徑嗎?

是。 C11標准(有關詳細信息,請閱讀n1570 )不涉及字符編碼。

一個不同的問題是您的特定實現對此類路徑做了什么。 邪惡在於細節,它們可能是丑陋的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM