DedSec Project

UTF-8 — DedSec Project

UTF-8 — bytes, κωδικά σημεία και ορατά σύμβολα Γιατί τα μήκη διαφέρουν Η UTF-8 κωδικοποιεί Unicode τιμές σε ένα έως τέσσερα bytes. Η Python len(str) μετρά code points, όχι bytes ή ορατές…

UTF-8 — bytes, κωδικά σημεία και ορατά σύμβολα

Γιατί τα μήκη διαφέρουν

Η UTF-8 κωδικοποιεί Unicode τιμές σε ένα έως τέσσερα bytes. Η Python len(str) μετρά code points, όχι bytes ή ορατές μονάδες γραφής (grapheme clusters). Ένα τονισμένο γράμμα μπορεί να έχει ένα έτοιμο code point ή βασικό γράμμα μαζί με combining mark. Η αυθαίρετη αποκοπή bytes μπορεί να χαλάσει δεδομένα.

Παράδειγμα Python 3

import unicodedata

text = "Aé🚀"
encoded = text.encode("utf-8")
assert len(text) == 3
assert len(encoded) == 7
assert encoded.decode("utf-8") == text

combined = "e\u0301"
precomposed = "é"
assert len(combined) == 2
assert len(precomposed) == 1
assert unicodedata.normalize("NFC", combined) == precomposed

Το A έχει ένα byte, το é δύο και το emoji 🚀 τέσσερα: 1+2+4=7. Η κανονικοποίηση NFC βοηθά σε κανονικά ισοδύναμες ακολουθίες, αλλά δεν επιλύει όλα τα οπτικά παρόμοια σύμβολα ή τη γλωσσική ταξινόμηση.

Ασκήσεις αποτυχίας

  1. Πάρε μόνο δύο bytes από το emoji και δοκίμασε strict decode. Περίμενε UnicodeDecodeError.
  2. Σύγκρινε decode με errors="replace" και strict mode. Η αντικατάσταση κρύβει τις ακριβείς χαλασμένες τιμές.
  3. Αναζήτησε ελληνικό κείμενο με lower() και casefold(), εφαρμόζοντας όπου χρειάζεται normalization. Κατάγραψε τις γλωσσικές ιδιαιτερότητες.
  4. Κατά την ανάγνωση/εγγραφή αρχείων όρισε encoding="utf-8" και έλεγξε bytes μετά από round-trip.
  5. Δοκίμασε συνδυαστικά σημάδια και emoji πολλών code points. Το slicing Python strings δεν συμφωνεί πάντα με τα όρια ορατών συμβόλων.

Τελικός έλεγχος

Σημείωσε έκδοση Python, αρχικά bytes και code points. Μήκος database field, όριο SMS και θέση cursor μπορεί να χρησιμοποιούν άλλες μονάδες μέτρησης· δήλωσε τη μονάδα αντί για γενικό «χαρακτήρες».