Decodificación correcta de los nombres de los archivos de entrada zip: CP437, UTF-8 o?

Hace poco escribí una biblioteca de E / S de archivos zip llamadazipzap, pero me cuesta descifrar correctamente los nombres de los archivos de entrada zip de archivos zip arbitrarios.

Ahora elEspecificaciones PKWARE estados

D.1 El formato ZIP ha admitido históricamente solo el conjunto de codificación de caracteres de PC original de IBM, comúnmente denominado página de códigos de IBM 437 ...

D.2 Si el bit 11 de propósito general no está establecido, el nombre del archivo y el comentario deben cumplir con la codificación de caracteres ZIP original. Si se establece el bit 11 de propósito general, el nombre de archivo y el comentario deben ser compatibles con el estándar de Unicode, versión 4.1.0 o superior, utilizando la forma de codificación de caracteres definida por la especificación de almacenamiento UTF-8 ...

lo que significa que los archivos zip conformes codifican los nombres de archivo como CP437, a menos que se establezca el bit EFS, en cuyo caso los nombres de archivo son UTF-8.

Desafortunadamente, parece que muchas herramientas zip no configuran el bit de EFS correctamente (por ejemplo, CLI de Mac, zip de GUI) o usan alguna otra codificación, normalmente la del sistema predeterminado (por ejemplo, ¿WinZip?). Si sabe cómo WinZip, 7-Zip, Info-Zip, PKZIP, Java JAR / Zip, .NET zip, dotnetzip, etc. codifica los nombres de los archivos y cómo configuran su campo "versión hecha por" cuando.zipping, por favor dime.

En particular, Info-Zip intenta esto cuandodescomprimiendo:

Sistema de archivos = MS-DOS (0) => CP437excepto: versión = 2.5, 2.6, 4.0 => ISO 8859-1Sistema de archivos = HPFS (6) => CP437Sistema de archivos = NTFS (10) y versión = 5.0 => CP437de lo contrario, ISO 8859-1

Si quiero admitir la inspección o extracción de archivos zip arbitrarios y hacer unarazonable intento de codificar el nombre del archivo sin la bandera EFS, ¿qué puedo buscar?

Respuestas a la pregunta(2)

Su respuesta a la pregunta