it-swarm.com.de

Chinesische Kodierung in Namen komprimierter Dateien in zip

Es tut uns leid, dass Sie eine Frage ähnlich wie meine vorherige gestellt haben. Der Unterschied zur letzten Frage besteht darin, dass es sich jetzt in einem Zip-Archiv befindet, in dem die chinesische Kodierung in Namen komprimierter Dateien nicht erkannt wird, sowohl nach dem Extrahieren als auch nach dem Auflisten des Inhalts des Zip-Archivs:

$ 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

Ich habe mich gefragt, wie ich mit diesem Problem umgehen soll.

Danke und Grüße!


aktualisieren:

Ich habe dieses Zip-Archiv hochgeladen und es kann von http://www.mediafire.com/?dw87ee72m56evy9 heruntergeladen werden


Ich habe versucht, chardet zu verwenden, um die Kodierung der Namen der komprimierten Dateien zu bestimmen:

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

Aber sind die Dateinamen tatsächlich in utf-8 verschlüsselt? Sollen sie nicht in einer fremden Kodierung sein? Ich denke, die Ausgabe von unzip -l sind zu viel, und wie soll ich nur die Dateinamen in seiner Ausgabe als Eingabe für chardet herausgreifen?

5
Tim

Versuchen:

unzip -O cp936 "严蔚敏数据结构(c语言版)教材及答案.Zip"
3
ChandlerQ

Ich würde die Dateien extrahieren und dann a

ls | chardet

um zu sehen, was es sagt.

Sie können auch verschiedene Codierungen mit ausprobieren

ls | iconv -f GB2312

beispielsweise. Sie können die Codierung, die iconv bekannt ist, mit iconv -l Sehen.

Wenn Sie die Kodierung einmal festgelegt haben, nehmen wir an, GB2312, sollten Sie die Dateinamen ändern, um die Kodierung in UTF8 zu ändern

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

EDIT

Versuchte einen Brute-Force-Angriff auf Ihre Zip-Datei und konvertierte in jede bekannte Kodierung, aber keine davon scheint mir plausibel zu sein

#!/bin/bash

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

Sie benötigen iconv, aber convmv und cconv sind optional.

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

Manchmal gibt es eine falsche Zeichenkodierung in der Konvertierungskette. Die Lücke muss man übrigens in enzotib s Beitrag finden.

Zum Beispiel eine Datei mit dem Namen "冼 极 .otf" in einem utf8-Dateisystem.

touch 冼极.otf

Ich muss die folgenden Schritte ausführen, um den korrekten Namen "宋体 .otf" zu erhalten.

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

Nachdem man seinen korrekten Namen hat, kann man die Konvertierung für vereinfachtes traditionelles Chinesisch mit cconv wie im folgenden Shell-Skript durchführen. In meinem Fall "宋體 .otf" endlich.

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

Hier ist ein weiteres Beispiel für den Beitrag von Daniel. Eine Datei mit dem Namen "ý¹úÖ¾.txt" in einem utf8-Dateisystem.

touch ý¹úÖ¾.txt

Nach einigen Spuren finde ich, dass der korrekte vereinfachte chinesische Name "三国 三国 .txt" von ist

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

Dann benenne ich es in traditioneller chinesischer Bezeichnung "三國 三國 .txt" um

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

Flosse

0
jemin

Normalerweise werden die Dateinamen als westlicher Zeichensatz interpretiert. Daher müssen Sie zuerst die Dateinamen von UTF-8 zurück in ISO konvertieren und dann diesen "Byte-Stream" als GB2312 zurück in UTF-8 interpretieren. d. h .:

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

Dies funktioniert nicht für Ihre spezifische Datei, daher möchten Sie möglicherweise herausfinden, wie die Datei erstellt wurde (welches System, welches Programm, welche Sprache usw.).

Siehe auch http://en.wikipedia.org/wiki/Mojibake

0