[PyAthens] Filename corruption

Christos Georgiou tzot at sil-tec.gr
Fri Dec 4 14:51:11 CET 2009


George Sakkis wrote:
> Όχι άμεσα σχετικό με Python το παρακάτω, αλλά μιας και έγινε κουβέντα
> για encodings και unicode στην τελευταία συνάντηση είπα να πάρω τη
> βοήθεια του κοινού.

> Παρακάτω ακολουθεί μικρό δείγμα από ένα σχετικό directory (λόγω χώρου
> κάνω extract μόνο την πρώτη λέξη κάθε αρχείου). Αν κάποιος μπορέσει να
> αποκρυπτογραφήσει τα πειραγμένα ονόματα έχει free
> σουβλάκια/πίτσα/μπύρα στο επόμενο meeting ;-)

Αν μιλάμε για τζάμπα μάσα, να παίξω!

>>>> import os
>>>> words = sorted(set(f.split()[0] for f in os.listdir('.')))
>>>> words
> ['00021.wmv',
>  'KET\xe2\x95\xac\xd0\xa8',
>  '\xce\x95\xcf\x80\xce\xb9\xcf\x83\xce\xba\xce\xb5\xcf\x80\xcf\x84\xce\xae\xcf\x81\xce\xb9\xce\xbf',
>  '\xe2\x95\xac\xd0\xb0\xe2\x95\xac\xe2\x94\x90\xe2\x95\xac\xe2\x95\x97\xe2\x95\xac\xe2\x95\xa3\xe2\x95\xa7\xd0\x94\xe2\x95\xac\xe2\x95\xa1\xe2\x95\xac\xd0\xbf\xe2\x95\xac\xe2\x96\x92',
>  '\xe2\x95\xac\xd0\xb3\xe2\x95\xa7\xd0\x94\xe2\x95\xac\xe2\x96\x92']
>

Από τη στιγμή που τώρα τον έχεις κάνει mount ως UTF-8, όλα τα αρχεία σού 
έρχονται κωδικοποιημένα κατά UTF-8, ό,τι κι αν είναι από κάτω.

Η ζημιά που έχεις πάθει είναι αρκετά μεγάλη, επειδή για κάποιο λόγο 
κάποια αρχεία έχουν τρίδιπλες κωδικοποιήσεις μέσα στο ίδιο filename…
Για παράδειγμα, το
'\xe2\x95\xac\xd0\xb0\xe2\x95\xac\xe2\x94\x90\xe2\x95\xac\xe2\x95\x97\xe2\x95\xac\xe2\x95\xa3\xe2\x95\xa7\xd0\x94\xe2\x95\xac\xe2\x95\xa1\xe2\x95\xac\xd0\xbf\xe2\x95\xac\xe2\x96\x92'
είναι

 >>> print s.decode('utf_8').encode('cp855', 'replace').decode('utf_8', 
replace')
Πολι?���α

Μπορώ να παίξω, αν θέλεις, και αν δεν είναι εμπιστευτικά τα filenames 
(π.χ. αν συμπεριλαμβάνονται και αρχεία με όνομα "Γλείψιμο μεγάλου 
δαχτύλου του δεξιού ποδιού από άρτι ενηλικιωθείσα μοναχή.wmv"). Κάνε μου 
τη χάρη να πας στα «ριζά» του δίσκου που έχει γίνει mount ως UTF_8, και 
δώσε ένα find . -print | gzip -9 >/tmp/filenames.gz , το οποίο 
/tmp/filenames.gz ανέβασέ το κάπου και στείλε εδώ το link.

>>>> import chardet
>>>> for w in words: print w, chardet.detect(w)
> ...
> 00021.wmv {'confidence': 1.0, 'encoding': 'ascii'}
> KET╬Ш {'confidence': 0.8191677051323929, 'encoding': 'IBM855'}
> Επισκεπτήριο {'confidence': 0.98999999999999999, 'encoding': 'utf-8'}
> ╬а╬┐╬╗╬╣╧Д╬╡╬п╬▒ {'confidence': 0.98999999999999999, 'encoding': 'utf-8'}
> ╬г╧Д╬▒ {'confidence': 0.98999999999999999, 'encoding': 'utf-8'}
> _______________________________________________



More information about the PyAthens mailing list