我想知道文件系統中文件名的字符編碼,以便在GUI中正確顯示它們。如何知道文件名的字符編碼(取決於文件系統)
我該怎麼做?
我想我得到不同的字符編碼依賴於文件系統(FAT,NTFS,EXT3等)
謝謝
(我在C++中工作,但這個話題是不是語言相關的)
我想知道文件系統中文件名的字符編碼,以便在GUI中正確顯示它們。如何知道文件名的字符編碼(取決於文件系統)
我該怎麼做?
我想我得到不同的字符編碼依賴於文件系統(FAT,NTFS,EXT3等)
謝謝
(我在C++中工作,但這個話題是不是語言相關的)
NTFS是Unicode(UTF-16)。 exFAT也是Unicode。
原始FAT和fAT32使用OEM字符集(詳情請閱讀MSDN)。
在Linux和Unix上,文件名可能包含除NUL之外的任何字節,並且未定義字符集。因此,每個應用程序決定使用哪一個。許多應用程序使用UTF8。詳見this question。
上面的unix方法用於大多數文件系統(主要是因爲「charset」概念在操作系統級別比在存儲級別更有意義)。您可以檢查文件名字符here(表2第3列)的FS功能和要求。
Unicode是一種抽象表示,而不是字節表示。你需要一個編碼來將unicode轉換爲字節。 – user803422
@ user803422在Windows中的「Unicode」代表UTF16。我已經更新了答案。 –
在我的Windows 7 - NTFS驅動器上,文件名是UTF-8。所以UTF-16不是一般規則。 MSDN的解釋相當複雜。 – user803422
在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;
}
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) –
它取決於filsystem本身。有些文件系統支持字符編碼,有些則只支持一種。由於編碼已經由其規範文檔定義,所以大多數不會將編碼存儲在文件系統本身中。您必須手動將這些信息存儲在您自己的數據庫中。 – Jay
這實際上取決於API,因此您使用的是平臺(OS)。但是,在C++ 17中,文件系統標準庫可能是完整的並且包含在內,這應該可能以某種方式解決這個問題。 –