2012-11-07 31 views
7

Gần đây tôi đã viết thư viện I/O tệp zip có tên là zipzap, nhưng tôi đang gặp khó khăn với việc giải mã chính xác tên tệp mục nhập zip từ các tệp zip tùy ý.Giải mã chính xác các tên tệp mục nhập zip - CP437, UTF-8 hoặc?

Bây giờ, PKWARE spec trạng thái:

D.1 Định dạng ZIP trong lịch sử chỉ được hỗ trợ ban đầu của IBM PC nhân vật mã hóa thiết lập, thường được gọi là IBM Mã Trang 437 ...

D.2 Nếu không đặt mục tiêu chung bit 11, tên tệp và nhận xét phải phù hợp với đối với mã hóa ký tự ZIP gốc. Nếu mục đích chung chút 11 được thiết lập, tên tập tin và bình luận phải hỗ trợ Unicode chuẩn, phiên bản 4.1.0 hoặc lớn hơn bằng cách sử dụng hình thức mã hóa ký tự được định nghĩa bởi UTF-8 lưu trữ đặc điểm kỹ thuật ...

mà có nghĩa là các tệp zip phù hợp mã hóa tên tệp là CP437, trừ khi bit EFS được đặt, trong trường hợp đó tên tệp là UTF-8. Không may là có vẻ như rất nhiều công cụ zip không đặt bit EFS chính xác (ví dụ: Mac CLI, GUI zip) hoặc sử dụng một số mã hóa khác, thường là hệ thống mặc định (ví dụ: WinZip?). Nếu bạn biết WinZip, 7-Zip, Thông tin-Zip, PKZIP, Java JAR/Zip, .NET zip, dotnetzip, vv .. mã hóa tên tệp và những gì họ đặt trường "phiên bản được tạo bởi" thành khi nén, vui lòng nói với tôi.

Đặc biệt, cố gắng Thông tin-Zip này khi giải nén:

  • Hệ thống tập tin = MS-DOS (0) => CP437
    • trừ: version = 2.5, 2.6, 4.0 = > hệ thống ISO 8859-1
  • file = HPFS (6) => CP437
  • file hệ thống NTFS = (10) và phiên bản = 5,0 => CP437
  • khác, ISO 8859-1

Nếu tôi muốn hỗ trợ kiểm tra hoặc chiết xuất từ ​​các tập tin zip tùy ý và thực hiện một nỗ lực mã hóa tên file mà không cờ EFS, những gì tôi có thể nhìn cho?

Trả lời

2

Cách duy nhất để xác định xem tên tệp được mã hóa là UTF-8 không sử dụng cờ EFS là để kiểm tra xem bit thứ tự cao có được đặt trong một trong các ký tự hay không. Điều đó có thể có thể là có nghĩa là ký tự đó được mã hoá UTF-8. Tuy nhiên, nó vẫn có thể là một cách khác vì có một số ký tự trong CP437 có bit đặt hàng cao và không có nghĩa là được giải mã dưới dạng UTF-8.

Tôi sẽ tuân thủ đặc tả ghi chú ứng dụng PKWARE và không tấn công vào một giải pháp cố gắng tuân thủ mọi ứng dụng zip đã biết tồn tại.

2

Tại tình hình lúc này là như sau:

  • nhất của việc triển khai Windows sử dụng hệ điều hành DOS (OEM) mã hóa
  • tiện ích zip
  • Mac OS sử dụng utf-8, nhưng nó không được thiết lập utf-8-bit cờ
  • * Tiện ích nix zip âm thầm sử dụng hệ thống mã hóa

Vì vậy, cách duy nhất là để kiểm tra xem tên tập tin chứa một cái gì đó giống như nhân vật utf8 (kiểm tra mô tả mã hóa utf8 - byte đầu tiên nên 110xx xxx, giây - 10xxxxxx đối với các ký tự được mã hóa 2 byte). Nếu đó là chuỗi utf8 đúng - hãy sử dụng mã hóa utf8. Nếu không - quay trở lại mã hóa OEM/DOS.

Các vấn đề liên quan