Unicode, κωδικοποιήσεις και πολυγλωσσική αναζήτηση — DedSec Project
Unicode, κωδικοποιήσεις και πολυγλωσσική αναζήτηση Unicode, κωδικοποιήσεις και πολυγλωσσική αναζήτηση Το UTF-8 κωδικοποιεί χαρακτήρες Unicode σε bytes. Ένας ορατός χαρακτήρας ενδέχεται να…
Unicode, κωδικοποιήσεις και πολυγλωσσική αναζήτηση
Το UTF-8 κωδικοποιεί χαρακτήρες Unicode σε bytes. Ένας ορατός χαρακτήρας ενδέχεται να αποτελείται από πολλαπλά σημεία κώδικα. Η len() δεν μετρά απαραίτητα τα ορατά γραφήματα. Η κανονικοποίηση NFC/NFD βοηθά στη σύγκριση, ενώ η casefold αντιμετωπίζει ορισμένες διαφορές πεζών/κεφαλαίων καλύτερα από την lower.
Παράδειγμα
import unicodedata as u
def fold(value):
normalized = u.normalize('NFD', value.casefold())
return ''.join(c for c in normalized if u.category(c) != 'Mn')
assert fold('Αθήνα') == fold('Αθηνα')
Ασκήσεις
- Σύγκρινε όμοια οπτικά κείμενα με διαφορετική κανονικοποίηση.
- Διατήρησε τα ελληνικά ονόματα σε ZIP.
- Πρόσθεσε εφεδρική μετάφραση για άγνωστο κλειδί.
- Παρουσίασε αρχικό μήνυμα σφάλματος χωρίς αλλοίωση.
Unicode και κωδικοποίηση κειμένου
Το πρόβλημα και η ουσία
Δύο strings μπορεί να φαίνονται ίδια αλλά να έχουν άλλα codepoints. Ένας τονισμένος χαρακτήρας μπορεί να είναι precomposed ή base + combining mark. Η NFC προσφέρει κοινή αναπαράσταση σύγκρισης αλλά δεν λύνει κάθε περίπτωση οπτικά όμοιου κειμένου.
Παράδειγμα
import unicodedata
left = 'é'
right = 'e\u0301'
assert left != right
assert unicodedata.normalize('NFC', left) == unicodedata.normalize('NFC', right)
assert len(left.encode('utf-8')) != len(right.encode('utf-8'))
Ανεξάρτητος έλεγχος
Δοκίμασε ελληνικά με τόνο και τελικό σίγμα με casefold. Μέτρησε codepoints και bytes χωριστά. Μην κάνεις normalize binary αρχεία· αποφάσισε NFC/NFKC, casefold ή accent-sensitive search διατηρώντας display text.
Επίσημη τεκμηρίωση: https://docs.python.org/3/library/unicodedata.html