моя операционная система является Дугой Linux. Я пытаюсь извлечь архив .zip, который содержит символы CJK в его именах файлов. Это было, скорее всего, создано на машине Windows.
Я попробовал разархивировать утилиту, и она произвела недопустимые символы. То же с 7za, но с немного отличающимися. Моя переменная ЛЕНГА была установлена на 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 вывод. Это также означает, что не невозможно, что я не имею дело с исходным кодированием во-первых.
Так, почему два архивировал бы экстракторы, приводят к различным результатам и там, кто-либо другой ведет, чтобы помочь мне преобразовать эти имена файлов в UTF-8 правильно?
Мое первое предположение, при контакте с путями UTF8, должно попытаться использовать Python zipfile библиотека - я предполагаю, что его достаточно межплатформенное для потребностей (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 и выполненный - видят, работает ли это в Вашем случае.
Во всем бесконечном неправдоподобии это решит Вашу проблему.