Codificação chinesa em nomes de arquivos compactados em zip

5

Desculpe por fazer uma pergunta semelhante a meu anterior . A diferença da última pergunta é que agora ela está em um arquivo zip onde a codificação em chinês nos nomes dos arquivos compactados não é reconhecida, tanto após a extração quanto após listar o conteúdo do arquivo 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

Eu queria saber como lidar com esse problema?

Obrigado e cumprimentos!

atualização:

Carreguei este arquivo zip e ele pode ser baixado do link

Eu tentei usar o chardet para determinar a codificação dos nomes dos arquivos compactados por:

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

Mas os nomes dos arquivos são realmente codificados em utf-8? Eles não deveriam estar em uma codificação estrangeira? Eu acho que a saída por unzip -l é demais, e como eu devo destacar apenas os nomes dos arquivos em sua saída como entrada para chardet?

    
por Tim 10.06.2011 / 23:44

4 respostas

3

Tente:

unzip -O cp936 "严蔚敏数据结构(c语言版)教材及答案.zip"
    
por ChandlerQ 17.12.2015 / 22:30
2

Eu extrairia os arquivos e faria um

ls | chardet

para ver o que diz.

Além disso, você pode tentar diferentes codificações com

ls | iconv -f GB2312

por exemplo. Você pode ver a codificação conhecida como iconv com iconv -l .

Uma vez determinada a codificação, vamos supor que seja GB2312, você deve modificar os nomes dos arquivos, para alterar a codificação para UTF8

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

EDITAR

Tentei um ataque de força bruta no seu arquivo zip, convertendo para todas as codificações conhecidas, mas nenhuma delas parece ser plausível

#!/bin/bash

iconv -l | 
  sed  's|//$||' | 
  while read enc; do 
    printf "\n --- $enc ---\n\n"
    ls | iconv -cf "$enc" 2>/dev/null
  done
    
por enzotib 11.06.2011 / 10:26
0

Normalmente, os nomes dos arquivos são interpretados como charset ocidental. Assim, você deve primeiro converter os nomes de arquivos de UTF-8 de volta para ISO e interpretar esse "byte-stream" como GB2312 de volta para UTF-8. ou seja:

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

Isto não funciona para o seu arquivo específico, então você pode querer descobrir como o arquivo foi criado (qual sistema, qual programa, qual idioma etc.)

Veja também link

    
por Daniel Kenzelmann 15.01.2015 / 16:51
0

Você precisará de iconv , mas convmv e cconv são opcionais.

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

Às vezes, há uma codificação incorreta de caracteres na cadeia de conversão. Você tem que encontrar a lacuna, a propósito, na postagem de enzotib .

Por exemplo, um arquivo chamado "冼 极 .otf" em um sistema de arquivos utf8.

touch 冼极.otf

Eu tenho que fazer o seguinte para obter o nome correto "宋体 .otf".

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

Depois de um ter seu nome correto, pode-se gostar de fazer a conversão chinesa tradicional simplificada pelo uso de cconv como no script de shell abaixo. No meu caso "宋體 .otf" finalmente.

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

Aqui está outro exemplo relativo à postagem de Daniel . Um arquivo chamado "ý¹úÖ¾.txt" em um sistema de arquivos utf8.

touch ý¹úÖ¾.txt

Depois de algumas trilhas, acho que o nome chinês simplificado correto é "三国 志 .txt" por

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

Em seguida, renomeio para o nome chinês tradicional "三國 志 .txt" por

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

Fin

    
por jemin 23.07.2015 / 08:08

Tags