2012-09-02 26 views
7

我想知道文件系統中文件名的字符編碼,以便在GUI中正確顯示它們。如何知道文件名的字符編碼(取決於文件系統)

我該怎麼做?

我想我得到不同的字符編碼依賴於文件系統(FAT,NTFS,EXT3等)

謝謝

(我在C++中工作,但這個話題是不是語言相關的)

+2

它取決於filsystem本身。有些文件系統支持字符編碼,有些則只支持一種。由於編碼已經由其規範文檔定義,所以大多數不會將編碼存儲在文件系統本身中。您必須手動將這些信息存儲在您自己的數據庫中。 – Jay

+0

這實際上取決於API,因此您使用的是平臺(OS)。但是,在C++ 17中,文件系統標準庫可能是完整的並且包含在內,這應該可能以某種方式解決這個問題。 –

回答

5

NTFS是Unicode(UTF-16)。 exFAT也是Unicode。

原始FAT和fAT32使用OEM字符集(詳情請閱讀MSDN)。

在Linux和Unix上,文件名可能包含除NUL之外的任何字節,並且未定義字符集。因此,每個應用程序決定使用哪一個。許多應用程序使用UTF8。詳見this question

上面的unix方法用於大多數文件系統(主要是因爲「charset」概念在操作系統級別比在存儲級別更有意義)。您可以檢查文件名字符here(表2第3列)的FS功能和要求。

+0

Unicode是一種抽象表示,而不是字節表示。你需要一個編碼來將unicode轉換爲字節。 – user803422

+0

@ user803422在Windows中的「Unicode」代表UTF16。我已經更新了答案。 –

+0

在我的Windows 7 - NTFS驅動器上,文件名是UTF-8。所以UTF-16不是一般規則。 MSDN的解釋相當複雜。 – user803422

0

在Linux中運行以下命令:locale | egrep「LANG =」|切-d。 -f 2

在類Unix系統上,文件名的編碼不是在文件系統級設置,而是在用戶環境中設置。例如,UTF-8是Ubuntu中的默認設置。

在Windows上,默認編碼是CP-1252(AKA ISO-8859-1或Latin-1),但FS通過UTF-16編碼使用Unicode。見http://en.wikipedia.org/wiki/Filename

但是,如果你使用Qt,你可以使用Qt Creator構建以下結果,並將結果作爲當前用戶編碼名稱。

#include <QTextCodec> 
#include <iostream> 

using namespace std; 
int main(int argc, char *argv[]) 
{ 
    Q_UNUSED(argc); Q_UNUSED(argv); 
    QTextCodec* tc = QTextCodec::codecForLocale(); 

    cout << "Current names text codec: " << tc->name().data() << endl; 
    return 0; 
} 
+1

ISO 8859-1和Latin-1是相同的東西,但Windows-1252/CP-1252略有不同: 「這種編碼是ISO 8859-1的超集,但與IANA的ISO-8859-1不同,使用可顯示字符而不是80至9F(十六進制)範圍內的控制字符。「 - [Wikipedia](http://en.wikipedia.org/wiki/Windows-1252) –

相關問題