[PYTHON] Quoi! Le nom du fichier décompressé était SJIS! commander?

SJIS baise

Lorsque vous utilisez Linux, lorsque le fichier zip téléchargé depuis le Japon est développé, le nom du fichier japonais est déformé et cela se produit souvent. Donc, je l'utilise généralement tel quel sans m'en soucier, et quand je n'en ai pas besoin, j'ai envie de le jeter. Même s'il y a des fichiers nécessaires, ce n'est pas un grand nombre, alors je l'ai renommé moi-même. Cette fois, il y avait une situation où c'était inutile à moins que je ne corrige un bon nombre de fichiers, alors j'ai fait un peu de recherche.

Cause

C'est essentiellement parce qu'une application exécutant plusieurs octets sous Windows intègre le nom de fichier brut dans zip avec cp932. Si cela est écrit dans le système de fichiers en tant que cp932 lorsqu'il est développé du côté Linux, la conversion est facile. C'est juste une question de renommer via iconv -f shift-jis -t utf-8 dans le shell. Lors de l'exportation brute, seul 0x2F est absent en termes de nom de fichier, mais cela n'est pas inclus dans le deuxième octet de cp932, donc cela ne semble pas être un problème. Cependant, il semble qu'une certaine conversion a été appliquée à la partie non ASCII et qu'elle ne peut pas être restaurée correctement.

Abandonnez et déployez en Python

Quand j'ai cherché, il y avait un échange comme "Ecrire en Python avec Stack Overflow", donc c'était facile à écrire. Je suis une personne qui ne peut généralement pas écrire des outils utiles en langage glu.

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]))

Un script qui développe simplement le fichier zip du premier argument, pensant qu'il a un nom de fichier SJIS, sans tenir compte de la gestion des erreurs.

C'était en fait plus facile

Donc, si je creuse la cause des personnages brouillés en pensant que je devrais faire une note sur Qiita, il fera sombre sous le phare. Orz avec une option pour convertir correctement le code de caractère

$ unzip -O sjis foo.zip

Il semble que ce soit tout ce dont vous avez besoin. D'une manière ou d'une autre, -O et -I sont l'opposé de mon intuition, mais il semble que -O spécifie l'encodage dans l'archive et -I spécifie l'encodage du système de fichiers de destination. De plus, il semble que le codage étrange ait été effectué parce que la détection automatique a échoué.

Lisez à propos de l'aide avant de regarder la source, moi. De plus, Qiita a également Answer.

Résumé

C'était un gaspillage complet de travail si je soulevais mon poids et faisais quelque chose que je ne ferais pas normalement. Mais pourquoi aimez-vous écrire du gros code mais détestez-vous écrire du code court? Peut-être parce que le rapport de la plaque de la chaudière est élevé.

Recommended Posts

Quoi! Le nom du fichier décompressé était SJIS! commander?
[Linux] Quelle est la méthode de confirmation du nom d'hôte autre que la commande hostname?
Remplacez le nom du répertoire et le nom du fichier dans le répertoire par une commande Linux.
Le nom du fichier était mauvais en Python et j'étais accro à l'importation
Python efficace était efficace comme son nom l'indique
Essayez de réécrire le fichier avec la commande less
Extraire uniquement le nom du fichier à l'exclusion du répertoire dans le répertoire
Ajustez les autorisations des fichiers avec la commande Linux chmod
C'est un Mac. Qu'est-ce que la commande Linux Linux?
Le nom de fichier enregistré par pysheng était un nombre hexadécimal, donc je l'ai corrigé.
Je veux voir le nom de fichier de DataLoader
Obtenir le nom de fichier dans un dossier à l'aide de glob
Spécifiez le nom du fichier lors de l'envoi de courriers électroniques en pièce jointe csv
Programme Python qui recherche le même nom de fichier