2

моя операционная система - Arch Linux. Я пытаюсь извлечь ZIP-архив, который содержит символы CJK в именах файлов. Скорее всего, он был создан на компьютере с Windows.

Я попытался распаковать утилиту, и она выдает недопустимые символы. То же самое с 7za, но с немного другими. Моя переменная LANG была установлена в en_US.UTF-8, но установка ее в ja_JP.ujis, похоже, не имеет никакого эффекта. Я предполагаю, что это означает, что имена файлов CJK были закодированы в архив в формате, отличном от UTF-8, и мне нужно преобразовать его в UTF-8, чтобы они отображались правильно.

Я знаю о convmv, и я использовал сценарий оболочки для проверки любой возможной кодировки из convmv --list безрезультатно. У меня есть Unicode-эквиваленты имен файлов по большей части, но в формате, который является громоздким, чтобы переименовать их вручную, но с их помощью я могу проверить, было ли преобразование успешным или нет.

Наблюдая за шестнадцатеричным дампом ls и с позиционным удержанием, я пришел к выводу, что U+4EBA (人) представляется как 0xC9 0x6C с выходом распаковки и 0xC2 0x90 0x6C с выходом 7za. Это также означает, что не исключено, что я не имею дело с оригинальной кодировкой.

Итак, почему два zip-экстрактора дают разные результаты, и есть ли другие способы помочь мне правильно преобразовать эти имена файлов в UTF-8?

1 ответ1

0

Мое первое предположение при работе с путевыми именами UTF8 состоит в том, чтобы попытаться использовать библиотеку zipfile Python - я предполагаю, что ее кроссплатформенности достаточно для ваших нужд (OTOH, документы по модулю ничего не упоминают о UTF8 ...).

Вот небольшой скрипт, чтобы попытаться это:

#!/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])

Это может быть chmod +x 'd и запустить - посмотрите, работает ли он в вашем случае.

При всей бесконечной невероятности это решит вашу проблему.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .