2012-09-02 16 views
7

Chciałbym poznać kodowanie znaków nazw plików w systemie plików, aby wyświetlać je poprawnie w GUI.jak rozpoznać kodowanie znaków nazw plików (w zależności od systemu plików)

Jak powinienem to zrobić?

Chyba uzyskać różne kodowanie znaków w zależności od systemu plików (FAT, NTFS, ext3, etc.)

Dziękuję

(pracuję w C++, ale ten wątek nie jest język pokrewne)

+2

To zależy od samego systemu plików. Niektóre systemy plików obsługują kodowanie znaków, a niektóre tylko jeden. A większość nie zapisuje kodowania w systemie plików, ponieważ kodowanie jest już zdefiniowane w dokumencie specyfikacji. Będziesz musiał ręcznie przechowywać te informacje we własnej bazie danych. – Jay

+0

To naprawdę zależy od API, a więc od platformy (OS), której używasz. Jednak w C++ 17 może być skompilowana i zawarta biblioteka standardowa systemu plików, co powinno jakoś rozwiązać ten problem. –

Odpowiedz

5

NTFS to kod Unicode (UTF-16). exFAT to także Unicode.

Oryginalny zestaw znaków FAT i FAT32 używa zestawu znaków OEM (więcej informacji na stronie MSDN).

W systemie Linux i Unix nazwa pliku może zawierać dowolne bajty z wyjątkiem NUL, a zestaw znaków nie jest zdefiniowany. W konsekwencji każda aplikacja sama decyduje, którego użyć. Wiele aplikacji używa UTF8. Zobacz więcej w this question.

Powyższe podejście unix używane jest w większości systemów plików (głównie dlatego, że koncepcja "zestawu znaków" ma większe znaczenie na poziomie systemu operacyjnego niż na poziomie pamięci masowej). Możesz sprawdzić możliwości FS i wymagania dotyczące nazw plików here (tabela 2 kolumna 3).

+0

Unicode jest reprezentacją abstrakcyjną, a nie reprezentacją bajtów. Potrzebujesz kodowania, aby przekonwertować kod Unicode na bajty. – user803422

+0

@ user803422 "Unicode" jak w Windows oznacza UTF16. Zaktualizowałem odpowiedź. –

+0

Na moim dysku Windows 7 - NTFS, nazwy plików są w UTF-8. Tak więc UTF-16 nie jest ogólną zasadą. Wyjaśnienie MSDN jest dość skomplikowane. – user803422

0

W systemie Linux uruchom następujące polecenie: locale | egrep "LANG =" | wyciąć -d. -f 2

W systemach uniksowych kodowanie nazw plików nie jest ustawione na poziomie systemu plików, ale raczej w środowisku użytkownika. Na przykład UTF-8 jest domyślnym ustawieniem w Ubuntu.

W systemie Windows domyślne kodowanie to CP-1252 (AKA ISO-8859-1 lub Latin-1), ale FS używa Unicode za pomocą kodowania UTF-16. Zobacz http://en.wikipedia.org/wiki/Filename.

Ale jeśli używasz Qt, możesz zbudować następujące rzeczy za pomocą Qt Creator, a wynikiem będzie bieżąca nazwa kodowania użytkownika.

#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 i Latin-1 to to samo, ale Windows-1252/CP-1252 jest nieco inny: "To kodowanie jest nadzbiorem ISO 8859-1, ale różni się od ISO-8859-1 IANA przez używając wyświetlanych znaków zamiast kontrolować znaki w zakresie od 80 do 9F (hex). " - [Wikipedia] (http://en.wikipedia.org/wiki/Windows-1252) –