Βασικές Κωδικοποιήσεις (Encoding)
Η κωδικοποίηση (encoding) είναι η διαδικασία αναπαράστασης δεδομένων με συγκεκριμένους κανόνες και σύνολα χαρακτήρων. Χρησιμοποιείται σε προγραμματισμό, ιστοσελίδες, APIs, αρχεία, βάσεις δεδομένων και δίκτυα. Σε αυτόν τον οδηγό παρουσιάζονται οι βασικές κωδικοποιήσεις, ο τρόπος λειτουργίας τους και παραδείγματα μετατροπής.
1. Κωδικοποιήσεις δυαδικών δεδομένων (Binary-to-Text)
Μετατρέπουν bytes σε εκτυπώσιμους χαρακτήρες. Είναι χρήσιμες όταν δυαδικά δεδομένα πρέπει να μεταφερθούν ή να ενσωματωθούν σε περιβάλλοντα κειμένου.
Base16 (Hexadecimal)
Χρησιμοποιεί 16 σύμβολα: 0–9 και A–F. Κάθε δεκαεξαδικό ψηφίο αντιστοιχεί σε 4 bit, επομένως κάθε byte αναπαρίσταται με δύο δεκαεξαδικά ψηφία. Χρησιμοποιείται σε debugging, διευθύνσεις μνήμης, χρωματικούς κωδικούς και αναπαράσταση bytes.
Παράδειγμα: Το γράμμα H έχει ASCII/UTF-8 τιμή 72 στο δεκαδικό σύστημα, δηλαδή 48 σε hexadecimal. Το i είναι 105 δεκαδικό, δηλαδή 69 hexadecimal. Άρα το Hi γίνεται 4869.
Base32
Χρησιμοποιεί 32 σύμβολα: A–Z και 2–7. Κάθε χαρακτήρας αναπαριστά 5 bit. Στην τυπική μορφή RFC 4648 χρησιμοποιείται = ως padding.
Αλφάβητο Base32: ABCDEFGHIJKLMNOPQRSTUVWXYZ234567
| Δεκαδική τιμή | Χαρακτήρας Base32 |
|---|---|
| 0 | A |
| 1 | B |
| 2 | C |
| 3 | D |
| 4 | E |
| 5 | F |
| 6 | G |
| 7 | H |
| 8 | I |
| 9 | J |
| 10 | K |
| 11 | L |
| 12 | M |
| 13 | N |
| 14 | O |
| 15 | P |
| 16 | Q |
| 17 | R |
| 18 | S |
| 19 | T |
| 20 | U |
| 21 | V |
| 22 | W |
| 23 | X |
| 24 | Y |
| 25 | Z |
| 26 | 50 |
| 27 | 51 |
| 28 | 52 |
| 29 | 53 |
| 30 | 54 |
| 31 | 55 |
Base64
Χρησιμοποιεί 64 σύμβολα: A–Z, a–z, 0–9, + και /. Κάθε χαρακτήρας αναπαριστά 6 bit. Στην τυπική μορφή RFC 4648 μπορεί να προστεθεί padding με =.
Αλφάβητο Base64: ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/
| Δεκαδική τιμή | Χαρακτήρας Base64 |
|---|---|
| 0 | A |
| 1 | B |
| 2 | C |
| 3 | D |
| 4 | E |
| 5 | F |
| 6 | G |
| 7 | H |
| 8 | I |
| 9 | J |
| 10 | K |
| 11 | L |
| 12 | M |
| 13 | N |
| 14 | O |
| 15 | P |
| 16 | Q |
| 17 | R |
| 18 | S |
| 19 | T |
| 20 | U |
| 21 | V |
| 22 | W |
| 23 | X |
| 24 | Y |
| 25 | Z |
| 26 | a |
| 27 | b |
| 28 | c |
| 29 | d |
| 30 | e |
| 31 | f |
| 32 | g |
| 33 | h |
| 34 | i |
| 35 | j |
| 36 | k |
| 37 | l |
| 38 | m |
| 39 | n |
| 40 | o |
| 41 | p |
| 42 | q |
| 43 | r |
| 44 | s |
| 45 | t |
| 46 | u |
| 47 | v |
| 48 | w |
| 49 | x |
| 50 | y |
| 51 | z |
| 52 | 0 |
| 53 | 1 |
| 54 | 2 |
| 55 | 3 |
| 56 | 4 |
| 57 | 5 |
| 58 | 6 |
| 59 | 7 |
| 60 | 8 |
| 61 | 9 |
| 62 | + |
| 63 | / |
Base64URL
Παραλλαγή του Base64 για URLs και filenames. Αντικαθιστά το + με - και το / με _. Το padding = συχνά παραλείπεται, ανάλογα με την προδιαγραφή.
Base58
Χρησιμοποιεί 58 αλφαριθμητικά σύμβολα, αποφεύγοντας χαρακτήρες που μοιάζουν μεταξύ τους, όπως 0, O, I και l. Είναι γνωστό από διευθύνσεις και αναγνωριστικά στο οικοσύστημα Bitcoin.
Base85 (Ascii85)
Μετατρέπει ομάδες 4 bytes σε 5 εκτυπώσιμους χαρακτήρες, με ειδικούς κανόνες για τις τελευταίες ελλιπείς ομάδες. Προσφέρει μικρότερο αποτέλεσμα από το Base64 σε πολλές περιπτώσεις και συναντάται σε PostScript και PDF.
2. Κωδικοποιήσεις χαρακτήρων (Character Encoding)
Καθορίζουν πώς αντιστοιχίζονται γράμματα, αριθμοί και σύμβολα σε bytes. Η σωστή επιλογή είναι απαραίτητη για να εμφανίζεται σωστά το κείμενο σε διαφορετικά συστήματα.
ASCII
Το ASCII είναι πρότυπο 7 bit με 128 χαρακτήρες. Κάθε χαρακτήρας αντιστοιχίζεται απευθείας σε αριθμητική τιμή από 0 έως 127. Για παράδειγμα, το A είναι 65 δεκαδικό ή 0x41 hexadecimal. Δεν περιλαμβάνει ελληνικούς χαρακτήρες.
UTF-8
Το UTF-8 κωδικοποιεί κάθε Unicode code point σε 1 έως 4 bytes και είναι συμβατό με ASCII. Για παράδειγμα, το A γίνεται 41, ενώ το Ω (Unicode U+03A9) γίνεται CE A9. Είναι η προτεινόμενη επιλογή για τις περισσότερες σύγχρονες ιστοσελίδες και εφαρμογές.
UTF-16 και UTF-32
UTF-16: Αναπαριστά Unicode χαρακτήρες με μονάδες 16 bit. Κάποιοι χαρακτήρες χρειάζονται μία μονάδα και άλλοι δύο (surrogate pair). Για παράδειγμα, το Ω σε UTF-16 big-endian είναι 03 A9.
UTF-32: Χρησιμοποιεί σταθερά 32 bit ανά Unicode code point. Το Ω σε big-endian αναπαρίσταται ως 00 00 03 A9.
ISO-8859-7 και Windows-1253
Παλαιότερες κωδικοποιήσεις για ελληνικό κείμενο. Κάθε χαρακτήρας που υποστηρίζεται αντιστοιχίζεται σε ένα byte. Για παράδειγμα, το κεφαλαίο ελληνικό Α αντιστοιχεί συνήθως στο C1. Σε νέα έργα προτιμάται το UTF-8, επειδή υποστηρίζει πολύ περισσότερες γλώσσες και σύμβολα.
3. Κωδικοποιήσεις για Web και έγγραφα
URL Encoding (Percent-Encoding)
Μετατρέπει κάθε byte που δεν μπορεί ή δεν πρέπει να εμφανιστεί αυτούσιο σε URL στη μορφή %XX, όπου XX είναι η δεκαεξαδική τιμή του byte. Για παράδειγμα, το κενό γίνεται %20. Το Ω σε UTF-8 είναι τα bytes CE A9, άρα σε percent-encoding γίνεται %CE%A9.
HTML Entities (Character References)
Αναπαριστούν ειδικούς χαρακτήρες στην HTML. Χρησιμοποιούνται ονομαστικές μορφές, όπως & για το &, ή αριθμητικές μορφές, όπως < και < για το <. Ο browser τις ερμηνεύει και εμφανίζει τον αντίστοιχο χαρακτήρα.
Unicode Escape Sequences
Αναπαριστούν Unicode χαρακτήρες με ειδική σύνταξη μέσα σε κώδικα ή δεδομένα. Για παράδειγμα, σε JavaScript και JSON το \u03A9 αντιστοιχεί στο Ω. Ο parser διαβάζει τον δεκαεξαδικό αριθμό και τον μετατρέπει στον αντίστοιχο Unicode χαρακτήρα.
Quoted-Printable
Χρησιμοποιείται κυρίως σε email MIME. Τα bytes που χρειάζονται escaping γράφονται ως =XX, με XX τη δεκαεξαδική τιμή τους. Για παράδειγμα, το κενό μπορεί να αναπαρασταθεί ως =20, ενώ τα UTF-8 bytes του Ω (CE A9) ως =CE=A9.
4. Πώς γίνεται η μετατροπή (βήμα προς βήμα)
Κάθε κωδικοποίηση εφαρμόζει διαφορετικούς κανόνες. Στα παραδείγματα χρησιμοποιείται το κείμενο Hi ή ο χαρακτήρας Ω, ώστε να φαίνεται πώς μετατρέπονται οι αρχικοί χαρακτήρες σε αριθμούς, bytes ή ειδική μορφή κειμένου.
Base16 (Hexadecimal) – Διαδικασία
- Μετατρέπουμε πρώτα το κείμενο σε bytes, συνήθως με UTF-8.
- Χωρίζουμε κάθε byte σε δύο ομάδες των 4 bit.
- Μετατρέπουμε κάθε ομάδα σε ένα δεκαεξαδικό ψηφίο (0–F).
- Ενώνουμε τα ψηφία. Παράδειγμα: H =
01001000=48, i =01101001=69. ΆραHi→4869.
Base32 – Διαδικασία
- Μετατρέπουμε το κείμενο σε bytes. Το
Hiσε UTF-8 είναι48 69. - Γράφουμε τα bytes σε δυαδική μορφή:
01001000 01101001. - Ενώνουμε τα bits και τα χωρίζουμε σε ομάδες των 5 bit. Αν η τελευταία ομάδα δεν συμπληρώνεται, προσθέτουμε μηδενικά bits στο τέλος.
- Μετατρέπουμε κάθε ομάδα σε αριθμό 0–31 και χρησιμοποιούμε τη θέση του στον πίνακα Base32. Για το Hi οι ομάδες είναι
01001 00001 10100 10000, δηλαδή οι τιμές 9, 1, 20, 16 →JBUQ. - Προσθέτουμε padding
=σύμφωνα με το RFC 4648. Το τελικό αποτέλεσμα είναιJBUQ====.
Base64 – Διαδικασία
- Μετατρέπουμε το κείμενο σε bytes. Το
Hiείναι48 69. - Γράφουμε τα bytes σε bits:
01001000 01101001. - Χωρίζουμε τα bits σε ομάδες των 6. Αν λείπουν bits στο τέλος, συμπληρώνουμε με μηδενικά.
- Οι ομάδες για το Hi είναι
010010 000110 100100, δηλαδή 18, 6 και 36. Στο αλφάβητο Base64 αντιστοιχούν στους χαρακτήρες S, G και k. - Επειδή η αρχική είσοδος είχε 2 bytes αντί για πολλαπλάσιο των 3, προσθέτουμε ένα σύμβολο padding
=. Αποτέλεσμα:SGk=.
Base64URL – Διαδικασία
- Κωδικοποιούμε πρώτα τα bytes με τον κανονικό αλγόριθμο Base64.
- Αντικαθιστούμε κάθε
+με-και κάθε/με_. - Αφαιρούμε το τελικό
=padding μόνο όταν το επιτρέπει η μορφή ή το πρωτόκολλο που χρησιμοποιούμε. Για παράδειγμα, τοSGk=γίνεταιSGk.
Base58 – Διαδικασία
- Μετατρέπουμε τα bytes σε έναν μεγάλο ακέραιο αριθμό, θεωρώντας τα bytes ως αριθμό σε βάση 256.
- Διαιρούμε επανειλημμένα τον αριθμό με το 58 και κρατάμε τα υπόλοιπα.
- Αντιστοιχίζουμε τα υπόλοιπα στους χαρακτήρες του αλφαβήτου Base58 και διαβάζουμε τα ψηφία με αντίστροφη σειρά.
- Διατηρούμε ειδικά τα αρχικά μηδενικά bytes, τα οποία στο Bitcoin Base58 αντιστοιχούν σε αρχικούς χαρακτήρες
1. Χρησιμοποιούμε πάντα το ακριβές αλφάβητο της εφαρμογής.
Base85 (Ascii85) – Διαδικασία
- Χωρίζουμε τα bytes σε ομάδες των 4 bytes και τις ερμηνεύουμε ως έναν αριθμό 32 bit.
- Διαιρούμε τον αριθμό επανειλημμένα με το 85 και μετατρέπουμε τα υπόλοιπα σε χαρακτήρες του αλφαβήτου Ascii85.
- Μια πλήρης ομάδα 4 bytes παράγει συνήθως 5 χαρακτήρες. Η τελευταία ελλιπής ομάδα και ειδικές συντομεύσεις, όπως το
zγια τέσσερα μηδενικά bytes, ακολουθούν τους κανόνες της συγκεκριμένης παραλλαγής.
ASCII – Διαδικασία
- Επιλέγουμε έναν χαρακτήρα που υπάρχει στο ASCII.
- Αναζητούμε την αριθμητική του τιμή στον πίνακα ASCII.
- Αποθηκεύουμε την τιμή ως 7 bit ή σε ένα byte με το πιο σημαντικό bit μηδενικό. Παράδειγμα: A → 65 →
01000001(ή0x41). - Οι ελληνικοί χαρακτήρες δεν μπορούν να αναπαρασταθούν με το βασικό ASCII.
UTF-8 – Διαδικασία
- Εντοπίζουμε τον Unicode code point του χαρακτήρα, π.χ. Ω = U+03A9.
- Ο αλγόριθμος UTF-8 επιλέγει 1, 2, 3 ή 4 bytes ανάλογα με το εύρος του code point και τοποθετεί τα bits στα αντίστοιχα πρότυπα UTF-8.
- Για το Ω, το αποτέλεσμα είναι τα bytes
CE A9. Για ASCII χαρακτήρες, όπως το A, το byte παραμένει41.
UTF-16 και UTF-32 – Διαδικασία
- Ξεκινάμε από τον Unicode code point του χαρακτήρα.
- Στο UTF-16 τον μετατρέπουμε σε μία μονάδα 16 bit, εφόσον βρίσκεται στο βασικό πολυγλωσσικό επίπεδο, ή σε ζεύγος surrogate για μεγαλύτερες τιμές. Το Ω γίνεται
03 A9σε big-endian byte order. - Στο UTF-32 αποθηκεύουμε τον code point σε 32 bit. Το Ω γίνεται
00 00 03 A9σε big-endian byte order. - Η σειρά των bytes (endianness) και ενδεχόμενο BOM επηρεάζουν την τελική ακολουθία bytes ενός αρχείου.
ISO-8859-7 και Windows-1253 – Διαδικασία
- Επιλέγουμε την αντίστοιχη κωδικοσελίδα (character map).
- Αναζητούμε τον χαρακτήρα στον πίνακα της συγκεκριμένης κωδικοποίησης.
- Αποθηκεύουμε το αντίστοιχο byte. Για παράδειγμα, το ελληνικό κεφαλαίο Α αντιστοιχεί στο
C1και στις δύο αυτές κωδικοποιήσεις. - Αν ο χαρακτήρας δεν υποστηρίζεται από την κωδικοσελίδα, απαιτείται διαφορετική κωδικοποίηση, συνήθως UTF-8.
URL Encoding – Διαδικασία
- Κωδικοποιούμε πρώτα το κείμενο σε bytes, συνήθως με UTF-8.
- Αφήνουμε αμετάβλητους τους χαρακτήρες που επιτρέπονται από το αντίστοιχο μέρος του URL.
- Για κάθε byte που χρειάζεται escaping, γράφουμε
%και τη διψήφια hexadecimal τιμή του. Παράδειγμα: κενό →%20, Ω → UTF-8 bytes CE A9 →%CE%A9. - Σε query strings, οι φόρμες HTML συχνά χρησιμοποιούν
+για το κενό (application/x-www-form-urlencoded). Αυτό δεν είναι ίδιο με το γενικό percent-encoding όπου το κενό γράφεται%20.
HTML Entities – Διαδικασία
- Εντοπίζουμε χαρακτήρες που πρέπει να εμφανιστούν ως κείμενο και όχι να ερμηνευτούν ως HTML markup.
- Τους αντικαθιστούμε με named ή numeric character references. Για παράδειγμα,
&→&,<→<και Ω →Ω. - Ο HTML parser μετατρέπει το reference ξανά στον αντίστοιχο χαρακτήρα κατά την ανάγνωση του εγγράφου.
Unicode Escape Sequences – Διαδικασία
- Βρίσκουμε τον Unicode code point του χαρακτήρα.
- Τον γράφουμε με τη μορφή escape που απαιτεί η γλώσσα. Σε JavaScript και JSON, το Ω (U+03A9) γράφεται
\u03A9. - Ο parser αναγνωρίζει την ακολουθία και δημιουργεί τον αντίστοιχο χαρακτήρα. Η σύνταξη διαφέρει ανά γλώσσα προγραμματισμού.
Quoted-Printable – Διαδικασία
- Μετατρέπουμε το κείμενο στα bytes της επιλεγμένης κωδικοποίησης, συνήθως UTF-8.
- Αφήνουμε απευθείας τους επιτρεπόμενους εκτυπώσιμους χαρακτήρες και κωδικοποιούμε τα υπόλοιπα bytes ως
=XX. - Παράδειγμα: το Ω σε UTF-8 είναι CE A9, άρα γίνεται
=CE=A9. Το κενό μπορεί να παραμείνει ως κενό και δεν χρειάζεται υποχρεωτικά να γίνει=20. - Σε μεγάλες γραμμές εφαρμόζεται soft line break με
=στο τέλος της γραμμής, σύμφωνα με τους κανόνες MIME.
5. Συγκριτικός πίνακας βασικών κωδικοποιήσεων
| Κωδικοποίηση | Κατηγορία | Κύρια χρήση |
|---|---|---|
| Base16 (Hex) | Binary-to-Text | Bytes, debugging, χρώματα |
| Base32 | Binary-to-Text | Tokens, OTP, αναγνωριστικά |
| Base64 | Binary-to-Text | Email, APIs, Data URLs |
| Base64URL | Binary-to-Text | URLs, JWT |
| Base58 | Binary-to-Text | Bitcoin διευθύνσεις και αναγνωριστικά |
| Base85 | Binary-to-Text | PDF, PostScript |
| ASCII | Character Encoding | Βασικοί λατινικοί χαρακτήρες |
| UTF-8 | Character Encoding | Ιστοσελίδες, εφαρμογές, αρχεία |
| UTF-16 / UTF-32 | Character Encoding | Επεξεργασία Unicode κειμένου |
| ISO-8859-7 / Windows-1253 | Character Encoding | Παλαιότερα ελληνικά συστήματα |
| URL Encoding | Web Encoding | Δεδομένα σε URLs |
| HTML Entities | Web Encoding | Ειδικοί χαρακτήρες σε HTML |
| Unicode Escapes | Text Escaping | Αναπαράσταση Unicode σε κώδικα και δεδομένα |
| Quoted-Printable | MIME Transfer Encoding | Κείμενο email |
6. Encoding, Hashing, Encryption και Compression
- Encoding: Αλλάζει τη μορφή αναπαράστασης των δεδομένων και μπορεί συνήθως να αντιστραφεί χωρίς μυστικό κλειδί (π.χ. Base64).
- Hashing: Παράγει αποτύπωμα δεδομένων και δεν προορίζεται για αντιστροφή (π.χ. SHA-256).
- Encryption: Μετατρέπει τα δεδομένα ώστε να μην είναι αναγνώσιμα χωρίς το κατάλληλο κλειδί (π.χ. AES).
- Compression: Μειώνει το μέγεθος των δεδομένων (π.χ. Gzip).
7. Ποια κωδικοποίηση να επιλέξω;
- Για ιστοσελίδες και νέα έργα: UTF-8.
- Για μεταφορά δυαδικών δεδομένων σε κείμενο: Base64 ή Base64URL για URLs.
- Για tokens με αλφάβητο χωρίς διάκριση πεζών και κεφαλαίων: Base32.
- Για εμφάνιση και έλεγχο bytes: Hexadecimal (Base16).
- Για ειδικούς χαρακτήρες σε URLs: Percent-Encoding.
- Για ειδικούς χαρακτήρες σε HTML: HTML Entities, όπου απαιτείται.
- Για συμβατότητα με παλαιότερα ελληνικά συστήματα: ISO-8859-7 ή Windows-1253, μόνο όταν είναι αναγκαίο.
Σημείωση: Οι κωδικοποιήσεις δεν παρέχουν από μόνες τους ασφάλεια ή εμπιστευτικότητα. Για προστασία δεδομένων απαιτείται κατάλληλη κρυπτογράφηση και σωστή διαχείριση κλειδιών.