[PYTHON] Was! Der entpackte Dateiname war SJIS! Befehl?

SJIS Fuck

Wenn Sie unter Linux die aus Japan heruntergeladene Zip-Datei erweitern, wird der japanische Dateiname verstümmelt und es kommt häufig vor. Also benutze ich es normalerweise so, wie es ist, ohne mir darüber Sorgen zu machen, und wenn ich es nicht brauche, möchte ich es wegwerfen. Selbst wenn es notwendige Dateien gibt, ist es keine große Zahl, deshalb habe ich sie selbst umbenannt. Dieses Mal gab es eine Situation, in der es nutzlos war, wenn ich nicht eine gute Anzahl von Dateien reparierte, also habe ich ein wenig recherchiert.

Ursache

Grundsätzlich liegt es daran, dass eine App, die unter Windows Multibyte ausführt, den Dateinamen raw in zip mit cp932 einbettet. Wenn dies als cp932 in das Dateisystem geschrieben wird, wenn es auf Linux-Seite erweitert wird, ist die Konvertierung einfach. Die Geschichte ist, dass Sie es durch "iconv -f shift-jis -t utf-8" in der Shell umbenennen können. Beim Exportieren von Raw ist nur 0x2F außerhalb des Dateinamens, dies ist jedoch nicht im zweiten Byte von cp932 enthalten, sodass dies kein Problem zu sein scheint. Es scheint jedoch, dass eine Konvertierung auf den Nicht-ASCII-Teil angewendet wurde und nicht ordnungsgemäß wiederhergestellt werden kann.

Geben Sie auf und stellen Sie in Python bereit

Als ich suchte, gab es einen Austausch wie "Schreiben in Python mit Stapelüberlauf", so dass es einfach zu schreiben war. Ich bin eine Person, die normalerweise keine nützlichen Werkzeuge in Klebesprache schreiben kann.

unzip.py


#!/usr/bin/env python

import sys
import zipfile

def main(filename):
    with zipfile.ZipFile(filename) as zip:
        for info in zip.infolist():
            info.filename = info.filename.decode('shift-jis').encode('utf-8')
            zip.extract(info)

if __name__ == '__main__':
    sys.exit(main(sys.argv[1]))

Ein Skript, das einfach die Zip-Datei des ersten Arguments erweitert und denkt, dass es einen SJIS-Dateinamen hat, ohne die Fehlerbehandlung zu berücksichtigen.

Es war eigentlich einfacher

Wenn ich mich also mit der Ursache der verstümmelten Charaktere befasse, die denken, ich sollte mir eine Notiz über Qiita machen, sieht es unter dem Leuchtturm dunkel aus. Orz mit der Option, den Zeichencode richtig zu konvertieren

$ unzip -O sjis foo.zip

Es scheint, dass dies alles ist, was Sie brauchen. Irgendwie sind -O und -I das Gegenteil meiner Intuition, aber es scheint, dass -O die Codierung im Archiv und -I die Codierung des Zieldateisystems angibt. Es scheint auch, dass die seltsame Codierung durchgeführt wurde, weil die automatische Erkennung fehlgeschlagen ist.

Lesen Sie mehr über Hilfe, bevor Sie sich die Quelle ansehen. Darüber hinaus hat Qiita auch Antwort.

Zusammenfassung

Es war eine völlige Verschwendung von Arbeit, wenn ich mein Gewicht hob und etwas tat, was ich normalerweise nicht tun würde. Aber warum schreibst du gerne großen Code, hasst es aber, kurzen Code zu schreiben? Vielleicht, weil das Kesselplattenverhältnis hoch ist.

Recommended Posts

Was! Der entpackte Dateiname war SJIS! Befehl?
[Linux] Was ist eine andere Methode zur Bestätigung des Hostnamens als der Befehl hostname?
Ersetzen Sie den Verzeichnisnamen und den Dateinamen im Verzeichnis zusammen mit einem Linux-Befehl.
Der Dateiname war in Python schlecht und ich war süchtig nach Import
Effektiv Python war effektiv, wie der Name schon sagt
Versuchen Sie, die Datei mit dem Befehl less neu zu schreiben
Extrahieren Sie nur den Dateinamen mit Ausnahme des Verzeichnisses im Verzeichnis
Passen Sie die Dateiberechtigungen mit dem Linux-Befehl chmod an
Es ist ein Mac. Was ist der Linux-Befehl Linux?
Der von pysheng gespeicherte Dateiname war eine Hexadezimalzahl, daher habe ich ihn behoben.
Ich möchte den Dateinamen von DataLoader sehen
Abrufen des Dateinamens in einem Ordner mithilfe von glob
Geben Sie den Dateinamen an, wenn Sie eine an CSV angehängte E-Mail senden
Python-Programm, das nach demselben Dateinamen sucht