UnicodeDecodeError — DedSec Project
UnicodeDecodeError: αποκωδικοποίηση byte με σαφή πολιτική Τι συμβαίνει και πότε Το UnicodeDecodeError σημαίνει ότι τα ακατέργαστα bytes δεν αποτελούν έγκυρο κείμενο με την επιλεγμένη…
UnicodeDecodeError: αποκωδικοποίηση byte με σαφή πολιτική
Τι συμβαίνει και πότε
Το UnicodeDecodeError σημαίνει ότι τα ακατέργαστα bytes δεν αποτελούν έγκυρο κείμενο με την επιλεγμένη κωδικοποίηση. Η επέκταση αρχείου και οι υποθέσεις locale δεν αποτελούν συμβόλαιο. Μη χρησιμοποιείς errors='ignore' μόνο για να εξαφανιστεί το σφάλμα: μπορεί να αλλοιώσει σιωπηρά αναγνωριστικά, CSV πεδία και σημαντικά δεδομένα.
Αυτοτελές εκτελέσιμο παράδειγμα
Αποθήκευσε το παράδειγμα ως 015_UnicodeDecodeError.py και εκτέλεσε python3 015_UnicodeDecodeError.py. Ο έλεγχος καλύπτει τη λανθασμένη είσοδο και τη διορθωμένη περίπτωση.
from pathlib import Path
from tempfile import TemporaryDirectory
with TemporaryDirectory() as tmp:
path = Path(tmp) / "sample.txt"
path.write_bytes("café".encode("cp1252"))
try:
path.read_text(encoding="utf-8")
except UnicodeDecodeError as exc:
print("bad byte offset:", exc.start)
else:
raise AssertionError("wrong encoding accepted")
assert path.read_text(encoding="cp1252") == "café"
Διαγνωστική διαδικασία και ασφαλής διόρθωση
Εξέτασε μικρό δείγμα bytes σε hex, την προδιαγραφή του δημιουργού και τυχόν BOM. Αποκωδικοποίησε με την πραγματική κωδικοποίηση. Αν τα αρχεία ποικίλλουν, χρησιμοποίησε αξιόπιστα metadata ή απόρριψε τα αμφίσημα. Το errors='replace' ταιριάζει μόνο σε προβολή με σαφή προειδοποίηση απώλειας δεδομένων.
Πρακτικό εργαστήριο / έλεγχος ορίων
Κωδικοποίησε την ίδια λέξη σε UTF-8 και cp1252, σύγκρινε τα hex bytes και αποκωδικοποίησε σωστά και τις δύο. Πρόσθεσε δείγμα με κομμένη πολυ-byte ακολουθία UTF-8 και έλεγξε ότι ο strict decoder αποτυγχάνει στην αναμενόμενη θέση.
Ακριβής ανάκτηση bytes ή ρητά μη αναστρέψιμη προβολή
Αν δεν γνωρίζεις την κωδικοποίηση του δημιουργού, μην επιλέγεις αυθαίρετα Latin-1 μόνο επειδή δεν εμφανίζει σφάλμα. Η επιλογή surrogateescape επιτρέπει ελεγχόμενη επανακωδικοποίηση των μη αναγνώσιμων bytes χωρίς απώλεια. Το ενδιάμεσο κείμενο όμως δεν είναι κατάλληλο για ανεξέλεγκτη εμφάνιση ή ανταλλαγή.
raw = b'\xffA'
try: raw.decode('utf-8')
except UnicodeDecodeError as exc:
assert exc.start == 0 and exc.end == 1
else: raise AssertionError('expected invalid UTF-8')
recovered = raw.decode('utf-8', errors='surrogateescape')
assert recovered.encode('utf-8', errors='surrogateescape') == raw
assert '\ufffd' in raw.decode('utf-8', errors='replace')
Διάγνωση και τελική δοκιμή
Διατήρησε τα αρχικά bytes, σημείωσε τη θέση αποτυχίας και αναζήτησε την τεκμηριωμένη κωδικοποίηση του δημιουργού. Αν επιβεβαιωθεί, χρησιμοποίησέ την· διαφορετικά απομόνωσε το αρχείο ή εμφάνισε σαφώς επισημασμένη προβολή με απώλειες. Σύγκρινε τα bytes της λέξης café σε UTF-8 και cp1252 και πρόσθεσε μια κομμένη ακολουθία UTF-8. Απόδειξε ότι το errors='replace' αλλάζει τα δεδομένα, ενώ το surrogateescape επιτρέπει ακριβή επιστροφή στα αρχικά bytes.