Como especificar a codificação de caracteres para 7z?

5

Fazendo "7z x" no arquivo me dá

'20 ª.1 ¯® '$'22''¨à®¢®£à ¤áª ï ã«.rtf' IMG_6527.JPG ''$'22''¨à®¢®£à ¤áª ï, ¨áâ.doc' IMG_6532.JPG ''$'24''®¯ ᮣ« è¥­¨¥(3).doc' IMG_6542.JPG ''$'242227''.doc' IMG_6543.JPG IMG_6526.JPG

Claramente, alguns arquivos foram codificados de forma diferente e 7z, por padrão, não é convertido em utf8. Como dizer ao 7z para fazer a conversão?

As únicas opções que encontrei para o charset:

-scc{UTF-8|WIN|DOS} : set charset for for console input/output
-scs{UTF-8|UTF-16LE|UTF-16BE|WIN|DOS|{id}} : set charset for list files

WIN, DOS, UTF-8 não funcionam. Ao tentar adivinhar charset '7z -cscsCP1251 l 26-08-2016_10-18-14.zip' 7z dá aviso:

Unsupported charset: cp1251

o unzip faz isso corretamente (os símbolos cirílicos foram convertidos):

'20 к.1 по Кировоградская ул.rtf'  IMG_6532.JPG  'Доп  соглашение(3).doc'
26-08-2016_10-18-14.zip        IMG_6542.JPG  'Кировоградская, ист.doc'
IMG_6526.JPG               IMG_6543.JPG
IMG_6527.JPG               ДКП.doc

p7zip Versão 15.14.1 (locale = ru_RU.UTF-8, Utf16 = ativado, HugeFiles = ativado, 64 bits, 4 CPUs AMD Processador AMD Phenom (tm) II X4 960T (100FA0), ASM)

hexdump do início do arquivo ( od -tx1z -Ax ):

000000 50 4b 03 04 14 00 00 00 00 00 81 54 1a 49 7e 35  >PK.........T.I~5<
000010 fa 34 00 ec 00 00 00 ec 00 00 07 00 17 00 84 8a  >.4..............<
000020 8f 2e 64 6f 63 75 70 13 00 01 19 fd 45 54 d0 94  >..docup.....ET..<
000030 d0 9a d0 9f 2e 64 6f 63 00 00 00 00 d0 cf 11 e0  >.....doc........<
000040 a1 b1 1a e1 00 00 00 00 00 00 00 00 00 00 00 00  >................<
000050 00 00 00 00 3e 00 03 00 fe ff 09 00 06 00 00 00  >....>...........<
000060 00 00 00 00 00 00 00 00 01 00 00 00 71 00 00 00  >............q...<
000070 00 00 00 00 00 10 00 00 73 00 00 00 01 00 00 00  >........s.......<
000080 fe ff ff ff 00 00 00 00 70 00 00 00 ff ff ff ff  >........p.......<
000090 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff  >................<
*
000230 ff ff ff ff ff ff ff ff ff ff ff ff ec a5 c1 00  >................<
000240 07 80 19 04 00 00 f0 12 bf 00 00 00 00 00 00 10  >................<
000250 00 00 00 00 00 08 00 00 72 7b 00 00 0e 00 62 6a  >........r{....bj<
000260 62 6a 2a 16 2a 16 00 00 00 00 00 00 00 00 00 00  >bj*.*...........<
000270 00 00 00 00 00 00 00 00 19 04 16 00 34 8e 00 00  >............4...<
000280 48 7c 00 00 48 7c 00 00 4b 2c 00 00 00 00 00 00  >H|..H|..K,......<
000290 19 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  >................<
0002a0 00 00 00 00 00 00 00 00 ff ff 0f 00 00 00 00 00  >................<
0002b0 00 00 00 00 ff ff 0f 00 00 00 00 00 00 00 00 00  >................<
0002c0 ff ff 0f 00 00 00 00 00 00 00 00 00 00 00 00 00  >................<
0002d0 00 00 00 00 b7 00 00 00 00 00 3e 0e 00 00 00 00  >..........>.....<
0002e0 00 00 3e 0e 00 00 a0 1b 00 00 00 00 00 00 a0 1b  >..>.............<
0002f0 00 00 00 00 00 00 a0 1b 00 00 00 00 00 00 a0 1b  >................<
000300 00 00 00 00 00 00 a0 1b 00 00 14 00 00 00 00 00  >................<
000310 00 00 00 00 00 00 ff ff ff ff 00 00 00 00 b4 1b  >................<
000320 00 00 00 00 00 00 b4 1b 00 00 00 00 00 00 b4 1b  >................<
000330 00 00 38 00 00 00 ec 1b 00 00 84 00 00 00 70 1c  >..8...........p.<
000340 00 00 34 00 00 00 b4 1b 00 00 00 00 00 00 b8 28  >..4............(<
000350 00 00 e6 01 00 00 a4 1c 00 00 00 00 00 00 a4 1c  >................<
000360 00 00 00 00 00 00 a4 1c 00 00 00 00 00 00 a4 1c  >................<
000370 00 00 00 00 00 00 a4 1c 00 00 00 00 00 00 d8 1d  >................<
000380 00 00 00 00 00 00 d8 1d 00 00 00 00 00 00 d8 1d  >................<
000390 00 00 00 00 00 00 43 28 00 00 02 00 00 00 45 28  >......C(......E(<
0003a0 00 00 00 00 00 00 45 28 00 00 00 00 00 00 45 28  >......E(......E(<
*
0003c0 00 00 00 00 00 00 45 28 00 00 00 00 00 00 9e 2a  >......E(.......*<
0003d0 00 00 a2 02 00 00 40 2d 00 00 da 00 00 00 45 28  >[email protected](<
0003e0 00 00 2d 00 00 00 00 00 00 00 00 00 00 00 00 00  >..-.............<
0003f0 00 00 00 00 00 00 a0 1b 00 00 00 00 00 00 d8 1d  >................<
000400 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00  >................<
000410 00 00 00 00 00 00 d8 1d 00 00 00 00 00 00 d8 1d  >................<
000420
    
por pusheax 26.08.2016 / 10:23

2 respostas

3

Dependendo da codificação usada para criar o arquivo zip, talvez você possa evitar traduções indesejadas definindo temporariamente a localidade como "C":

LC_ALL=C 7z x $archive

(Isso ajudou a criar um zip criado pelo IZArc no Win7, usando dois dos seus nomes de arquivos de exemplo.)

No entanto, para o arquivo na pergunta, o campo "filename" contém a codificação CP1251 de "ДКП.doc" ( 84 8a 8f 2e 64 6f 63 ). O campo "extra" usa uma extensão Info-zip (veja a seção 4.6.9 da Zip Specification v 6.3.4 ) para armazenar o nome do arquivo UTF-8. unzip sabe sobre esse cabeçalho e usa o nome UTF-8, ignorando o nome CP1251.

7z não faz nada com esse "campo extra" e usa apenas o CP1251. Dependendo da localidade atual, ele pode criar o arquivo usando esse nome exato (os bytes brutos 84 8a 8f ), ou pior, tratá-los como pontos unicode a serem expandidos para UTF-8 primeiro ( c2 84 c2 8a c2 8f ).

Uma opção é usar utilitários externos para alterar o zip primeiro:

#!/bin/bash

cp orig.zip renamed.zip

index=0
zipinfo -1 orig.zip | while read name ; do
        ziptool renamed.zip rename $index "$name"
        index=$((index+1))
done

ziptool é de libzip . zipinfo é distribuído com o Info-ZIP's UnZip , então você deve ter usado apenas unzip

    
por 26.08.2016 / 11:15
1

Encontrei este tópico de discussão com o autor de p7zip , Igor Pavlov, na página do p7zip: Problemas de conjuntos de caracteres OEM no Linux . É um gêmeo deste Q & A. Este post diz tudo.

Probably -mcp switch doesn't work in p7zip. But -mcp works in 7-zip (Windows version). So now I don't know how to make it working for p7zip. the function: Rusting MultiByteToUnicodeString(const AString &srcString, UINT codePage) in CPP\Common\StringConvert.cpp

Data de 2016-04-18. Eu verifiquei o último lançamento do p7zip de julho e o switch ainda está faltando. Pelo menos na documentação, como eu não testei.

    
por 26.08.2016 / 20:27

Tags