Convertendo Codificação de Nome de Arquivo

2

meu sistema operacional é o Arch Linux. Eu estou tentando extrair um arquivo .zip que contém caracteres CJK em seus nomes de arquivos. Provavelmente foi criado em uma máquina Windows.

Eu tentei o utilitário unzip e ele produziu símbolos inválidos. O mesmo acontece com 7za, mas com outros ligeiramente diferentes. Minha variável LANG foi definida como en_US.UTF-8, mas configurá-la como ja_JP.ujis parece não ter efeito. Estou assumindo que isso significa que os nomes de arquivos CJK foram codificados no arquivo em um formato diferente de UTF-8, e eu preciso convertê-lo em UTF-8 para que eles sejam exibidos corretamente.

Eu conheço o convmv e usei um shell script para testar todas as codificações possíveis de convmv --list sem sucesso. Eu tenho os equivalentes Unicode dos nomes de arquivos para a maior parte, mas em um formato que é complicado para renomear manualmente todos eles, mas com eles eu posso verificar se a conversão foi bem-sucedida ou não.

Observando o dump hexadecimal de ls e com a dedução posicional, concluí que U + 4EBA (人) é representado como 0xC9 0x6C com a saída unzip e 0xC2 0x90 0x6C com a saída 7za. Isso também significa que não é impossível que eu não esteja lidando com a codificação original em primeiro lugar.

Então, por que dois extratores de zip produziriam resultados diferentes, e há outras pistas para me ajudar a converter esses nomes de arquivos para UTF-8 corretamente?

    
por kaykun 14.04.2011 / 03:15

1 resposta

0

Meu primeiro palpite, ao lidar com nomes de caminho UTF8, é tentar usar a biblioteca zipfile do Python - Acredito que sua plataforma cruzada seja suficiente para suas necessidades (OTOH, os documentos do módulo não mencionam nada sobre UTF8 ...) .

Aqui está um pequeno script para tentar isso:

#!/usr/bin/python
import zipfile
import sys
import os

if len(sys.argv) < 2:
    print "I require a file name and a directory to unzip to"
    sys.exit()
zip = zipfile.ZipFile(sys.argv[1])
if not os.path.exists(sys.argv[2]):
    os.mkdir(sys.argv[2])

zip.extractall(sys.argv[2])

Isso pode ser chmod +x 'd e executado - veja se funciona no seu caso.

Em toda a improbabilidade infinita, isso resolverá seu problema.

    
por 14.04.2011 / 03:35