2012-11-07 9 views
7

Niedawno napisałem bibliotekę we/wy pliku zip o nazwie zipzap, ale mam problemy z poprawnym odszyfrowaniem nazw plików wejściowych zip z dowolnych plików zip.Prawidłowe odszyfrowywanie nazw plików zip - CP437, UTF-8 lub?

Teraz, PKWARE spec stany:

D.1 Format ZIP historycznie obsługiwane tylko oryginalny zestaw znaków IBM PC kodowanie , powszechnie nazywany IBM CP437 ...

D.2 Jeśli bit 11 ogólnego zastosowania jest nieuzbrojony, nazwa pliku i komentarz powinny być zgodne z oryginalnym kodowaniem znaków w formacie ZIP pod numerem . Jeśli ogólnego przeznaczenia bit 11 jest ustawiony, nazwa pliku i komentarz musi obsługiwać standard Unicode, wersja 4.1.0 lub większą pomocą formularza kodowania znaków zdefiniowanego przez UTF-8 przechowywania specyfikacji ...

który oznacza, że ​​zgodne pliki zip kodują nazwy plików jako CP437, chyba że ustawiony jest bit EFS, w którym to przypadku nazwy plików mają format UTF-8.

Niestety wydaje się, że wiele narzędzi zip nie ustawia poprawnie bitu EFS (np. Mac CLI, GUI zip) lub używa innego kodowania, zazwyczaj domyślnego systemu (np. WinZip?). Jeśli wiesz, jak WinZip, 7-Zip, Info-Zip, PKZIP, Java JAR/Zip, .NET zip, dotnetzip, itp. Kodują nazwy plików i co ustawiają pole "wersja wykonana" na z zamkiem, proszę Powiedz mi.

W szczególności, próbuje Info-Zip to kiedy rozpakować:

  • systemu plików = MS-DOS (0) => 437,
    • z wyjątkiem: version = 2,5, 2,6, 4,0 = > System ISO 8859-1
  • file = HPFS (6) => System 437,
  • File = NTFS (10) i wersja = 5,0 => 437,
  • inaczej, ISO 8859-1

Jeśli chcę wspierać kontrolę lub wydobywania z dowolnych plików zip i zrobić rozsądny próbę kodowania nazw plików bez flagi EFS, co mogę patrzeć dla?

Odpowiedz

2

Jedynym sposobem określenia, czy nazwa pliku jest zakodowana jako UTF-8 bez użycia flagi EFS, jest sprawdzenie, czy bit wyższego rzędu jest ustawiony na jeden ze znaków. Może to być prawdopodobnie oznacza, że ​​znak jest kodowany w UTF-8. Jednak nadal może być inaczej, ponieważ w CP437 jest kilka znaków, które mają ustawiony bit wyższego rzędu i nie mają być dekodowane jako UTF-8.

Trzymałbym się specyfikacji specyfikacji aplikacji PKWARE i nie włamał się do rozwiązania, które stara się dostosować do każdej znanej aplikacji zip.

2

W sytuacji tej chwili jest w następujący sposób:

  • większość wdrożeń systemu Windows używać DOS (OEM) kodujący
  • Mac OS narzędzie zip używa UTF-8, ale nie ustawia UTF-8 bit Flagi
  • * nix narzędzia zip cicho wykorzystuje kodowanie systemu

więc jedynym sposobem jest sprawdzenie, czy nazwa pliku zawiera coś w rodzaju znaków utf8 (sprawdź opis kodowania utf8 - pierwszy bajt powinien być 110xx xxx, second - 10xxxxxx dla 2-bajtowych kodowanych znaków). Jeśli jest to poprawny ciąg utf8 - użyj kodowania utf8. Jeśli nie, powróć do kodowania OEM/DOS.

Powiązane problemy