2012-09-02 15 views
7

Ich möchte die Zeichenkodierung der Dateinamen in einem Dateisystem kennen, um sie korrekt in einer GUI anzuzeigen.wie man Zeichencodierung von Dateinamen kennt (abhängig vom Dateisystem)

Wie soll ich das tun?

Ich nehme ich verschiedene Zeichencodierung erhalten je nach Dateisystem (FAT, NTFS, ext3, etc.)

Danke

(I in C++ arbeiten, aber dieses Thema ist nicht die Sprache verwandt)

+2

Es hängt vom Filsystem selbst ab. Einige Dateisysteme unterstützen die Zeichencodierung und einige nur eine. Und die meisten speichern die Codierung nicht im Dateisystem selbst, da die Codierung bereits durch ihr Spezifikationsdokument definiert ist. Sie müssen diese Informationen manuell in Ihrer eigenen Datenbank speichern. – Jay

+0

Dies hängt wirklich von der API und damit von der verwendeten Plattform (OS) ab. In C++ 17 könnte jedoch die Dateisystem-Standardbibliothek vollständig und enthalten sein, was dieses Problem wahrscheinlich irgendwie lösen sollte. –

Antwort

5

NTFS ist Unicode (UTF-16). ExFAT ist auch Unicode.

Original FAT und fAT32 verwenden OEM-Zeichensatz (lesen Sie mehr unter MSDN).

Unter Linux und Unix kann der Dateiname beliebige Bytes außer NUL enthalten und der Zeichensatz ist nicht definiert. Folglich entscheidet jede Anwendung selbst, welche sie verwenden soll. Viele Anwendungen verwenden UTF8. Sehen Sie mehr in this question.

Der obige Unix-Ansatz wird bei den meisten Dateisystemen verwendet (hauptsächlich weil das "Charset" -Konzept auf OS-Ebene mehr Bedeutung hat als auf der Speicherebene). Sie können die FS-Funktionen und -Anforderungen bezüglich der Dateinamenzeichen here (Tabelle 2, Spalte 3) überprüfen.

+0

Unicode ist eine abstrakte Darstellung, keine Byte-Darstellung. Sie benötigen eine Codierung, um Unicode in Bytes zu konvertieren. – user803422

+0

@ user803422 "Unicode" wie in Windows steht für UTF16. Ich habe die Antwort aktualisiert. –

+0

Auf meinem Windows 7 - NTFS-Laufwerk sind die Dateinamen in UTF-8. Daher ist UTF-16 keine allgemeine Regel. Die MSDN-Erklärung ist ziemlich kompliziert. – user803422

0

In Linux dann folgenden Befehl ausführen: locale | egrep "LANG =" | geschnitten -d. -f 2

Auf Unix-ähnlichen Systemen wird die Codierung von Dateinamen nicht auf Dateisystemebene, sondern in der Benutzerumgebung festgelegt. Zum Beispiel ist UTF-8 die Standardeinstellung in Ubuntu.

Bei Windows-Standardcodierung ist CP-1252 (AKA ISO-8859-1 oder Latin-1), aber FS verwendet Unicode über UTF-16-Codierung. Siehe http://en.wikipedia.org/wiki/Filename.

Aber wenn Sie Qt verwenden, können Sie Folgendes mit Qt Creator erstellen und Ergebnis der aktuelle Benutzercodierungsname sein.

#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 und Latin-1 sind das gleiche, aber Windows-1252/CP-1252 ist etwas anders: "Diese Codierung ist eine Obermenge von ISO 8859-1, unterscheidet sich aber von der IANA ISO-8859-1 durch Verwenden Sie anzeigbare Zeichen anstelle von Steuerzeichen im Bereich 80 bis 9F (Hex). " - [Wikipedia] (http://en.wikipedia.org/wiki/Windows-1252) –

Verwandte Themen