Китайское кодирование на названия сжатых файлов в zip

Извините за задавание вопроса, подобного моему предыдущему. Различие от последнего вопроса - то, что теперь это находится в архиве zip, где китайское кодирование на названия сжатых файлов не распознано, и после извлечения и после списка содержания архива zip:

$ unzip -l "严蔚敏数据结构(c语言版)教材及答案.zip"
Archive:  严蔚敏数据结构(c语言版)教材及答案.zip
  Length      Date    Time    Name
---------  ---------- -----   ----
    25600  2000-01-04 23:27   ?+?+i- ??-?.doc
    80896  2000-01-04 23:27   ?+??i- -+.doc
    41984  2000-01-04 23:27   ?++?i- i+????-?.doc
    52224  2000-01-04 23:27   ?+?+i- ??i?.doc
    50688  2000-01-04 23:27   ?+??i- ??????.doc
    54272  2000-01-04 23:27   ?++?i- -????-??????.doc
    26112  2000-01-04 23:27   ?+?-i- ?????????_+?.doc
    76288  2000-01-04 23:27   ?+-?i- -??-????-?.doc
    53760  2000-01-04 23:27   ?+-?i- -+?+++?=.doc
    53760  2000-01-04 23:27   ?+--i- ??.doc
  7929077  2009-02-26 22:49   -???????+C????+??+?+?+pdf.pdf
---------                     -------
  8444661                     11 files

Я задавался вопросом, как иметь дело с этой проблемой?

Спасибо и всего наилучшего!


обновление:

Я загрузил этот архив zip на, и он может быть загружен с http://www.mediafire.com/?dw87ee72m56evy9


Я пытался использовать chardet для определения кодирования названий сжатых файлов:

$ unzip -l "严蔚敏数据结构(c语言版)教材及答案.zip" | chardet
<stdin>: utf-8 (confidence: 0.99)

Но имена файлов действительно кодируются в utf-8? Разве они не предположены быть во внешнем кодировании? Я предполагаю вывод unzip -l слишком много, и как я только выберу имена файлов в его выводе, как введено к chardet?

5
задан 13 April 2017 в 05:25

4 ответа

Я извлек бы файлы, затем сделал бы a

ls | chardet

видеть то, что это говорит.

Кроме того, Вы могли попробовать различную кодировку

ls | iconv -f GB2312

например. Вы видели кодирование, известное iconv с iconv -l.

После того, как определенный кодирование, давайте предположим, GB2312, необходимо изменить имена файлов, для изменения кодирования на UTF8

for f in *; do
  g="$(iconv -f GB2312 <<<"$f")"
  mv "$f" "$g"
done

Править

Попробованный атака перебором к Вашему zip-файлу, преобразовывая в каждое известное кодирование, но ни один из них, кажется, мне не вероятен

#!/bin/bash

iconv -l | 
  sed  's|//$||' | 
  while read enc; do 
    printf "\n --- $enc ---\n\n"
    ls | iconv -cf "$enc" 2>/dev/null
  done
2
ответ дан 23 November 2019 в 09:28

Обычно имена файлов интерпретируются как западный набор символов. Таким образом необходимо сначала преобразовать имена файлов из UTF-8 назад к ISO, затем интерпретируют тот "поток байтов" как GB2312 назад к UTF-8. т.е.:

ls | iconv-f UTF-8-t ISO8859-1 | iconv-f GB2312-t UTF-8

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

См. также http://en.wikipedia.org/wiki/Mojibake

0
ответ дан 23 November 2019 в 09:28

Вам будет нужен iconv, но convmv и cconv являются дополнительными.

Step 1, find the correct char-encode converting chain.
Step 2, rename files by a shell script.

Иногда, в цепочке преобразования существует неправильная кодировка символов. Необходимо узнать разрыв, между прочим в сообщении enzotib.

Например, файл, названный "冼极. otf" в utf8 файловой системе.

touch 冼极.otf

Я должен сделать followings для получения его корректного имени "宋体. otf".

convmv --notest -f utf8 -t cp950 *.otf
convmv --notest -f cp936 -t utf8 *.otf

После того, как у каждого есть его корректное имя, хотел бы делать упрощенный - традиционное китайское преобразование при помощи cconv как в сценарии оболочки ниже. В моем случае "宋體. otf" наконец.

#!/bin/sh
# bash shell script
mkdir TW
for filename in *; do [ -d "$filename" ] || echo "$filename" ; done |
    while read filename; do 
    filename_TW=`echo "$filename" | cconv -f UTF8-CN -t UTF8-TW` 
    printf "\n --- $filename $filename_TW ---\n\n"
    #uncomment lines below if you've confirmed the names
    #mv "$filename" "TW/$filename_TW"
    #touch "$filename"
    done

Вот другой пример относительно сообщения Daniel. Файл под названием "ý¹ъÖ¾.txt" в utf8 файловой системе.

touch ý¹úÖ¾.txt

После некоторых следов я нахожу, что его корректным именем упрощенного китайского является ".txt"

ls | iconv -f utf-8 -t iso-8859-1 | iconv -f cp936 -t utf-8

Затем я переименовываю его к традиционному китайскому имени ".txt"

#!/bin/sh
mkdir BACKUP
for filename in *; do [ -d "$filename" ] || echo "$filename" ; done |
    while read filename; do 
    filename_TW=`echo "$filename" | iconv -f utf-8 -t iso-8859-1 | iconv -f cp936 -t utf-8 | cconv -f UTF8-CN -t UTF8-TW` 
    mv "$filename" "$filename_TW"
    touch "BACKUP/$filename"
    done

Пластина

0
ответ дан 23 November 2019 в 09:28

Попытка:

unzip -O cp936 "严蔚敏数据结构(c语言版)教材及答案.zip"
3
ответ дан 23 November 2019 в 09:28

Другие вопросы по тегам:

Похожие вопросы: