Codificação de nomes de arquivos em arquivos zip

6

Há algumas perguntas aqui sobre letras não-ASCII nos nomes de arquivos armazenados como fluxos dentro de arquivos zip ( hebraico , chinês , japonês ou coreano ). No entanto, nenhuma das soluções fornecidas me ajudou com um arquivo zip com letras cirílicas que vieram de uma máquina Windows.

O arquivo tem um nome cirílico em si ( Космос.zip - link para download). Este é um arquivo com conteúdo de comprimento zero apenas para fins de ilustração.

unzip -l impressões:

Archive:  Космос.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   ɫ���߼��/ict_inf.pdf
---------                     -------
        0                     1 file

O feio ɫ���߼�� representa a seqüência de bytes C9 AB DF E8 AB DF BC AB DF .

Eu sei (usando o recurso de visualização do Gmail) que isso deve ser

Archive:  Космос.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   РосКосмос/ict_inf.pdf
---------                     -------
        0                     1 file

Precisamos mapear C9 AB DF E8 AB DF BC AB DF para РосКосмос .

Existem várias codificações cirílicas de 8 bits comumente usadas: CP1251, CP866, ISO8859-5, no entanto, elas teriam essa palavra codificada como uma seqüência diferente de bytes:

           Р  о  с  К  о  с  м  о  с
CP866:     90 AE E1 8A AE E1 AC AE E1
CP1251:    D0 EE F1 CA EE F1 EC EE F1
ISO8859-5: C0 DE E1 BA DE E1 DC DE E1

Claramente, nenhuma das codificações cirílicas de 8 bits comumente usadas decodifica os nomes de entrada para os nomes de saída como este. Há algo mais complicado no trabalho aqui.

Se soubéssemos como decodificar os nomes, renomear os arquivos após a extração seria fácil com um script find apropriado ( link ), por exemplo

find -mindepth 1 -exec sh -c 'mv "$1" "$(echo "$1" | here-goes-the-decoding pipeline )"' sh {} \;

ou o utilitário convmv .

    
por Dmitri Chubarov 03.05.2017 / 12:18

1 resposta

2

Encontrei uma solução no fórum OpenNET.ru, um popular recurso em idioma russo que é dedicado a software e tecnologias de código aberto desde 1996. A post no OpenNET sugere que o Info-ZIP, uma vez que um conjunto popular de ferramentas para manipular arquivos ZIP em computadores que executam o MS-DOS, presume que no MS-DOS existe apenas um 8- codificação de bits, ou seja, CP850, portanto, todos os nomes de arquivos são executados automaticamente através de CP850->CP1252 conversion. O CP1252 foi provavelmente escolhido como a aproximação mais popular da codificação do conjunto de caracteres ISO-8859-1.

Portanto, o comando find correto para executar depois de extrair um arquivo contendo nomes de arquivos cirílicos seria

find -mindepth 1 -exec sh -c \ 
  'mv "$1" "$(echo "$1" | iconv -f cp1252 -t cp850 | iconv -f cp866 )"' sh {} \;

Curiosamente, é possível encontrar sugestões para usar não o CP1252, mas o ISO-8859-1. Esse não parece ser o caso, pois um dos arquivos que encontrei a transformação iconv -f iso8859-1 -t cp850 falhou, enquanto iconv -f cp1252 -t cp850 foi convertido com êxito.

Voltando a personagens individuais

           Р  о  с  К  о  с  м  о  с
CP866:     90 AE E1 8A AE E1 AC AE E1

Agora aplicando o CP850 - > CP1252 resulta em C9 AB DF E8 AB DF BC AB DF . Exatamente a sequência que observamos.

Outro comando útil seria

 unzip -l РосКосмос.zip | grep -Ev '^Archive:' |\
  iconv -f iso8859-1 -t cp850 | iconv -f cp866

Para obter uma lista de arquivos do arquivo

 Length      Date    Time    Name
---------  ---------- -----   ----
        0  2017-05-03 18:19   РосКосмос/ict_inf.pdf
---------                     -------
        0                     1 file

Filtrar a linha que começa com Archive: é uma proteção para ocultar o nome do arquivo morto da conversão.

    
por 11.05.2017 / 09:07