2012-09-02 21 views
7

Vorrei conoscere la codifica dei caratteri dei nomi di file in un filesystem per visualizzarli correttamente in una GUI.come conoscere la codifica dei caratteri dei nomi di file (a seconda del filesystem)

Come devo fare?

Suppongo ricevo diversa codifica dei caratteri a seconda del file system (FAT, NTFS, ext3, etc.)

Grazie

(io lavoro in C++, ma questo argomento non è correlato lingua)

+2

Dipende dal file system stesso. Alcuni filesystem supportano la codifica dei caratteri, e alcuni solo uno. E la maggior parte non memorizza la codifica nel filesystem stesso poiché la codifica è già definita dal suo documento di specifiche. Dovrai memorizzare manualmente queste informazioni nel tuo database. – Jay

+0

Questo dipende molto dall'API e quindi dalla piattaforma (OS) che stai utilizzando. Tuttavia, in C++ 17 potrebbe essere la libreria standard del filesystem completa e inclusa, che dovrebbe probabilmente risolvere questo problema in qualche modo. –

risposta

5

NTFS è Unicode (UTF-16). exFAT è anche Unicode.

Originale FAT e FAT32 utilizzano il set di caratteri OEM (maggiori informazioni su MSDN).

Su Linux e Unix il nome file può contenere qualsiasi byte tranne NUL e il set di caratteri non è definito. Di conseguenza, ogni applicazione decide da sola quale utilizzare. Molte applicazioni usano UTF8. Vedi di più in this question.

L'approccio unix sopra è utilizzato sulla maggior parte dei file system (principalmente perché il concetto "charset" ha più significato a livello di sistema operativo che a livello di archiviazione). È possibile verificare le funzionalità ei requisiti di FS relativi ai caratteri del nome file here (tabella 2 colonna 3).

+0

Unicode è una rappresentazione astratta, non una rappresentazione di byte. È necessaria una codifica per convertire unicode in byte. – user803422

+0

@ user803422 "Unicode" come in Windows sta per UTF16. Ho aggiornato la risposta. –

+0

Sul mio Windows 7 - unità NTFS, i nomi dei file sono in UTF-8. Quindi l'UTF-16 non è una regola generale. La spiegazione MSDN è piuttosto complicata. – user803422

0

In Linux, eseguire il seguente comando: locale | egrep "LANG =" | tagliare -d. -f 2

Su sistemi di tipo Unix, la codifica dei nomi di file non è impostata a livello di file system, ma piuttosto nell'ambiente dell'utente. Ad esempio, UTF-8 è l'impostazione predefinita in Ubuntu.

In Windows la codifica predefinita è CP-1252 (AKA ISO-8859-1 o Latin-1), ma FS utilizza Unicode tramite la codifica UTF-16. Vedi http://en.wikipedia.org/wiki/Filename.

Ma se si utilizza Qt, è possibile creare quanto segue con Qt Creator e risultare il nome di codifica utente corrente.

#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 e Latin-1 sono la stessa cosa, ma Windows-1252/CP-1252 è leggermente diverso: "Questa codifica è un superset di ISO 8859-1, ma differisce dalla ISO-8859-1 della IANA per utilizzando caratteri visualizzabili anziché i caratteri di controllo nell'intervallo da 80 a 9F (hex). " - [Wikipedia] (http://en.wikipedia.org/wiki/Windows-1252) –

Problemi correlati