2017-02-18 6 views
0

Я считаю, что это распространенная проблема, когда речь идет о кодировке символов по умолчанию в Linux и Windows. Однако после того, как я обыскал в Интернете, у меня нет простого способа исправить это автоматически, и поэтому я собираюсь написать сценарий для этого.Имена файлов Windows отображают поврежденные символы в Linux

Вот сценарий:

Я создал некоторые файлы на системе Windows, некоторые, с не-английскими именами (китайский конкретно в моем случае). И я сжал их в zip-файл, используя 7-zip. После этого я загрузил zip-файл в Linux и извлекил файлы в системе Linux (Ubuntu 16.04 LTS) (программа архива по умолчанию). Насколько я уже догадался, все имена неанглийских файлов теперь отображаются как некоторые поврежденные символы! Сначала я думал, что это должно быть легко с convmv, но ...

Я пробовал convmv, и он говорит: «Пропуск, уже utf8». Ничего не изменилось.

А потом я решил написать инструмент с использованием Python для выполнения грязной работы, после некоторого тестирования я дошел до точки, где я не могу связать исходные имена файлов с поврежденными именами файлов (если только хэширование содержимого).

Вот пример. Настройка Я веб-сервер для просмотра списка имен файлов на Windows, и один файл, после того, как кодируется с «GBK» в питоне, отображаются как

u'j\u63a5\u53e3\u6587\u6863' 

И я могу запросить имена файлов в моей системе Linux. Я могу создать файл напрямую с именем, как показано выше, и имя CORRECT. Я также могу кодировать строку gbk unicode для кодировки utf8 и создавать файл, это имя также ПРАВИЛЬНО. (Таким образом, я не могу делать их одновременно, так как они действительно одно и то же). Теперь, когда я прочитал имя файла, которое я извлек ранее, это должен быть тот же файл. НО имя файла полностью отличается как:

декодирование с utf8, это что-то вроде u'j \ u255c \ u2559 ... '. декодирование его с помощью gbk привело к исключению UnicodeDecodeError, и я также попытался декодировать его с помощью utf8, а затем закодировать с помощью gbk, но результат все еще есть что-то еще.

Чтобы обобщить это, я не могу проверить исходное имя файла путем его декодирования или кодирования после его извлечения в систему linux. Если я действительно хочу, чтобы программа выполняла эту работу, мне нужно либо переделать архив, возможно, с некоторыми вариантами кодирования, либо просто пойти со своим скриптом, но используя хэш хэш файла (например, md5 или sha1), чтобы определить его исходный файл имя в Windows.

У меня есть все шансы вывести исходное имя из сценария python в вышеприведенном случае, кроме сравнения содержимого файла между двумя системами?

+1

Dupe других вопросов: http://stackoverflow.com/questions/9974779/using-unicode-characters-for-file-names-inside-a-zip-archive – selbie

+0

Сделайте поиск в Интернете по «zip-файлу и файлам Unicode». Вы не первый, кто ударил это. – selbie

+1

Нет такой вещи, как 'unicode gbk' –

ответ

1

С небольшим количеством экспериментов с общими кодировками, я был в состоянии изменить свое mojibake:

bad = 'j\xe2\x95\x9c\xe2\x95\x99\xe2\x94\x90\xe2\x94\x8c\xe2\x95\xac\xe2\x94\x80\xe2\x95\xa1\xe2\x95\xa1' 
>>> good = bad.decode('utf8').encode('cp437').decode('gbk') 
>>> good 
u'j\u63a5\u53e3\u6587\u6863'  # u'j接口文档' 

gbk - обычная кодировку китайского Окна
cp437 - общая консоль США для Windows OEM кодирование
utf8 - общее кодирования Linux

+0

Вау, это фантастика! Я никогда не думал о cp437 при попытке cp936. Спасибо! – Qianqian

Смежные вопросы