> For the complete documentation index, see [llms.txt](https://overleaf-pro.ayaka.space/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://overleaf-pro.ayaka.space/latex/el/se-vathos-arthra/51-unicode-utf-8-and-multilingual-text-an-introduction.md).

# Unicode, UTF-8 και πολύγλωσσο κείμενο: Μια εισαγωγή

## Unicode και OpenType: Χαρακτήρες και γλυφές

Οι σύγχρονες μηχανές TeX, δηλαδή οι XeTeX και LuaTeX, έχουν εξελιχθεί από την αρχική μηχανή TeX του Knuth σε μεγάλο βαθμό λόγω της ανάγκης να συμβαδίζουν με τις εξελίξεις στο τεχνολογικό τοπίο, ιδιαίτερα με το Unicode (για κείμενο) και το OpenType (για γραμματοσειρές). Σήμερα, μέσω της χρήσης πακέτων όπως [fontspec](https://ctan.org/pkg/fontspec?lang=en) και [unicode-math](https://ctan.org/pkg/unicode-math?lang=en), οι χρήστες της LaTeX μπορούν να έχουν πρόσβαση σε εξαιρετικά εξελιγμένες δυνατότητες στοιχειοθεσίας που παρέχονται από γραμματοσειρές OpenType—συμπεριλαμβανομένης της προηγμένης πολυγλωσσικής στοιχειοθεσίας και της μαθηματικής στοιχειοθεσίας βασισμένης στο OpenType ([που πρωτοπορήθηκε από τη Microsoft](https://blogs.msdn.microsoft.com/murrays)).

Ωστόσο, για να αξιοποιήσετε στο έπακρο τις γραμματοσειρές OpenType με XeTeX/LuaTeX, μπορεί να είναι χρήσιμο να εξοικειωθείτε με ορισμένα θέματα/έννοιες υποβάθρου—ιδίως για την αντιμετώπιση προβλημάτων ή για να ανοίξει ο δρόμος για πιο προχωρημένη/σύνθετη εργασία. Για παράδειγμα, μπορεί να διαβάσετε ότι οι μηχανές XeTeX και LuaTeX χρησιμοποιούν «είσοδο UTF-8» ή ότι είναι «ενήμερες για το Unicode», και περαιτέρω ανάγνωση για γραμματοσειρές OpenType μπορεί να συζητά ή να αναφέρει θέματα όπως «κωδικοποίηση Unicode», «χαρακτηριστικά γραμματοσειράς» OpenType, «γλυφές», «αναγνωριστικά γλυφών», «ονόματα γλυφών» και ούτω καθεξής. Στόχος μας είναι να παρέχουμε μια εισαγωγή σε αυτούς τους όρους/θέματα και να συναρμολογήσουμε ένα βασικό πλαίσιο για να δείξουμε πώς σχετίζονται και, ελπίζουμε, να παρέχουμε υποστήριξη για περαιτέρω εργασία ή επίλυση προβλημάτων.

Τα θέματα που σκοπεύουμε να καλύψουμε χωρίζονται αρκετά καθαρά σε δύο βασικούς τομείς: *Το Unicode* που, στην ουσία, κατοικεί στον κόσμο του κειμένου/των χαρακτήρων και της κωδικοποίησης κειμένου και *OpenType* του οποίου ο κόσμος είναι αυτός των γραμματοσειρών και των γλυφών· αλλά, φυσικά, αυτοί οι δύο κόσμοι είναι αλληλένδετοι και υπάρχει κάποια αλληλοεπικάλυψη, ακόμη και σε αυτό το πρώτο άρθρο.

### Ποια θέματα θα συζητήσουμε;

Το κύριο επίκεντρο αυτού του άρθρου είναι ορισμένα θέματα που σχετίζονται με το Unicode: ξεκινώντας με μια συζήτηση για το τι σημαίνει «χαρακτήρας» και συνεχίζοντας με την εισαγωγή σε γραφές/γλώσσες, κωδικοποίηση Unicode και UTF-8—μαζί με ένα παράδειγμα εργασίας με πολυγλωσσικά αρχεία κειμένου. Ένα επόμενο άρθρο θα βασιστεί σε αυτό το κείμενο για να καλύψει θέματα υποβάθρου που σχετίζονται με την τεχνολογία γραμματοσειρών OpenType. Σαφώς, στα όρια ενός blog post δεν είναι δυνατό να επιχειρήσουμε μια «βαθιά κατάδυση» σε όλους τους τομείς που ελπίζουμε να συζητήσουμε: ο δηλωμένος στόχος μας είναι να παρέχουμε το συνολικό πλαίσιο που δείχνει πώς συνδέονται και συνεργάζονται μερικές βασικές έννοιες. Θα ξεκινήσουμε με την πιο βασική έννοια: αυτή του *χαρακτήρα*.

## Ο χαρακτήρας: Ένα βασικό δομικό στοιχείο

Μια θεμελιώδης ιδέα/έννοια που βρίσκεται στον πυρήνα των συζητήσεών μας (και της Unicode) είναι η σημασία του «χαρακτήρα»: είναι μία από εκείνες τις λέξεις της οποίας η σημασία συχνά «θεωρείται δεδομένη» μέσα από τη χρήση της στην καθημερινή εργασία και στις συζητήσεις. Ωστόσο, από την οπτική της Unicode, της στοιχειοθεσίας και των τεχνολογιών γραμματοσειρών, χρειάζεται να είμαστε λίγο πιο ακριβείς και να ορίσουμε τι εννοείται με τον όρο «ένας χαρακτήρας». Για παράδειγμα, ίσως να είναι αρκετά φυσικό για εμάς να σκεφτόμαστε **a** και *a* ως διαφορετικούς «χαρακτήρες»: «α με έντονα» και «α με πλάγια». Αλλά όχι: είναι απλώς διαφορετικές οπτικές αναπαραστάσεις του ίδιου θεμελιώδους χαρακτήρα, τον οποίο η Unicode του δίνει το επίσημο όνομα [ΛΑΤΙΝΙΚΟ ΜΙΚΡΟ ΓΡΑΜΜΑ A](http://unicode.org/charts/PDF/U0000.pdf).

Το Unicode [ορίζει έναν χαρακτήρα](http://www.unicode.org/glossary/#character) ως:

> «Το μικρότερο συστατικό της γραπτής γλώσσας που έχει σημασιολογική αξία· αναφέρεται στην αφηρημένη σημασία και/ή μορφή, και όχι σε μια συγκεκριμένη μορφή...»

που διακρίνει σαφώς μεταξύ του συγκεκριμένου *οπτική εμφάνιση* σχήματος *σημασίας*.

Μπορείτε να θεωρήσετε έναν χαρακτήρα ως τη θεμελιώδη μονάδα, ή δομικό στοιχείο, μιας γλώσσας ή, πιο σωστά, μιας *σύστημα γραφής*—ένα θέμα που συζητούμε παρακάτω. Το πώς ακριβώς μοιάζει ένας χαρακτήρας όταν εμφανίζεται με μια συγκεκριμένη γραμματοσειρά δεν είναι σχετικό με τον ορισμό της Unicode για έναν χαρακτήρα: μόνο ο *σημασίας* έχει πραγματικό ενδιαφέρον εδώ: ο *ρόλος και ο σκοπός* κάθε χαρακτήρα ως ένα από ένα σύνολο δομικών στοιχείων από τα οποία τελικά κατασκευάζονται οι γραφές/γλώσσες.

### Γραφή και γλώσσα

Αξίζει να αναφέρουμε σύντομα δύο σημαντικές έννοιες: *γραφές* και *γλωσσών*. Ο ιστότοπος της Unicode παρέχει έναν χρήσιμο [ορισμό μιας γραφής](https://www.unicode.org/standard/supported.html):

> «Το Πρότυπο Unicode κωδικοποιεί γραφές και όχι γλώσσες. Όταν συστήματα γραφής για περισσότερες από μία γλώσσες μοιράζονται σύνολα γραφικών συμβόλων που έχουν ιστορικά συγγενείς προελεύσεις, η ένωση όλων αυτών των γραφικών συμβόλων αντιμετωπίζεται ως μία ενιαία συλλογή χαρακτήρων για κωδικοποίηση και ταυτοποιείται ως μία ενιαία γραφή.»

Χρησιμοποιώντας ένα [παράδειγμα από τη Wikipedia](https://en.wikipedia.org/wiki/Script_\(Unicode\)), η λατινική γραφή αποτελείται από μια συγκεκριμένη [συλλογή χαρακτήρων](http://unicode.org/charts/) οι οποίοι χρησιμοποιούνται σε πολλές γλώσσες: αγγλικά, γαλλικά, γερμανικά, ιταλικά κ.ο.κ. Φυσικά, δεν χρησιμοποιούνται όλοι οι χαρακτήρες που ορίζονται μέσα στη λατινική γραφή από όλες τις γλώσσες που βασίζονται στη λατινική γραφή—for παράδειγμα, το αγγλικό αλφάβητο δεν περιέχει τους τονισμένους χαρακτήρες που υπάρχουν σε άλλες ευρωπαϊκές γλώσσες όπως τα γαλλικά ή τα γερμανικά.

### Γραμματοσειρές OpenType: γραφές και γλώσσες

Σε αυτό το σημείο θα περάσουμε από το Unicode στις γραμματοσειρές OpenType επειδή οι έννοιες της γραφής και της γλώσσας παίζουν επίσης εξαιρετικά σημαντικό ρόλο μέσα στην τεχνολογία γραμματοσειρών OpenType.

Ένα σύνολο γλωσσών που χρησιμοποιούν την ίδια [σύστημα γραφής](http://www.unicode.org/glossary/#script) γραφή μπορεί καθεμία να έχει διαφορετικές τυπογραφικές παραδόσεις όταν πρόκειται για την εμφάνιση (στοιχειοθεσία) κειμένου γραμμένου σε συγκεκριμένη γλώσσα. Ένα καλό παράδειγμα βρίσκεται στην τουρκική γλώσσα και στη [συμπεριφορά του άτονου i](https://en.wikipedia.org/wiki/Dotted_and_dotless_I) (βλ. τις σημειώσεις εκείνης της σελίδας για τα συμπλέγματα). Οι τυπογραφικοί «κανόνες» που σχετίζονται με γραφές/γλώσσες είναι ενσωματωμένοι στη λειτουργικότητα των γραμματοσειρών OpenType μέσω της χρήσης των λεγόμενων πινάκων γραφής και γλώσσας *ετικετών* οι οποίοι χρησιμοποιούνται για την ταυτοποίηση κανόνων που θα πρέπει να ισχύουν για συγκεκριμένους συνδυασμούς γραφής/γλώσσας. Φυσικά, το σύνολο των γραφών/γλωσσών που υποστηρίζεται από κάθε γραμματοσειρά OpenType θα ποικίλλει ανάλογα με τις επιλογές που έκαναν οι δημιουργοί της γραμματοσειράς και τον λόγο για τον οποίο δημιουργήθηκε. Εξελιγμένο λογισμικό στοιχειοθεσίας, όπως το XeTeX ή το LuaTeX, μπορεί να αξιοποιήσει αυτούς τους κανόνες (ενσωματωμένους στις γραμματοσειρές OpenType) επιτρέποντας στους χρήστες να τους εφαρμόζουν επιλεκτικά στο κείμενο εισόδου κατά τη στοιχειοθεσία κειμένου σε συγκεκριμένη γλώσσα—for παράδειγμα, χρησιμοποιώντας το LaTeX [πακέτο fontspec](https://ctan.org/pkg/fontspec?lang=en).

#### Εξετάζοντας μέσα σε μια γραμματοσειρά OpenType: γραφές/γλώσσες

Μόνο για να το κάνουμε πιο σαφές, εδώ είναι ένα στιγμιότυπο οθόνης που δείχνει τη δωρεάν [γραμματοσειρά Scheherazade OpenType](http://software.sil.org/scheherazade/download/) ανοιγμένη μέσα στο επίσης δωρεάν [Microsoft VOLT](https://www.microsoft.com/en-us/Typography/volt.aspx) λογισμικό επεξεργασίας γραμματοσειρών. Σε αυτή την εικόνα μπορείτε να δείτε τις γραφές, τις γλώσσες και τα τυπογραφικά χαρακτηριστικά που είναι ενσωματωμένα στη Scheherazade—χρησιμοποιώντας το VOLT μπορείτε να προσθέσετε επιπλέον χαρακτηριστικά και λειτουργικότητα στη Scheherazade, αλλά αυτό βρίσκεται πολύ πέρα από το πεδίο αυτού του άρθρου!

![Η γραμματοσειρά Scheherazade OpenType (υποτύπου TrueType) ανοιγμένη μέσα στο Microsoft VOLT](/files/2cc97913b51ac5575abf3cab7d1ad95209c65fe7)

Από αυτό το στιγμιότυπο οθόνης μπορείτε να δείτε ότι η Scheherazade υποστηρίζει τις γραφές αραβική και λατινική και παρέχει περαιτέρω εξειδικευμένη υποστήριξη για αρκετές γλώσσες που χρησιμοποιούν την αραβική γραφή—χρησιμοποιώντας τα λεγόμενα χαρακτηριστικά OpenType, τα οποία παρατίθενται στο πλαίσιο με το πράσινο περίγραμμα παραπάνω. Δεν θα μπούμε στις λεπτομέρειες αυτών των χαρακτηριστικών αλλά το μήνυμα εδώ είναι ότι οι υψηλής ποιότητας γραμματοσειρές OpenType έχουν πολύ «νοημοσύνη» ενσωματωμένη μέσα τους, έτοιμη για χρήση από λογισμικό στοιχειοθεσίας ικανό να αξιοποιεί τυπογραφικούς κανόνες ενσωματωμένους στις γραμματοσειρές.

Ο ενδιαφερόμενος αναγνώστης μπορεί να περιηγηθεί στο μητρώο ετικετών OpenType για να δει τις [ετικέτες γραφής](https://www.microsoft.com/typography/otspec/scripttags.htm) και [ετικέτες γλώσσας](https://www.microsoft.com/typography/developers/opentype/languagetags.aspx) που χρησιμοποιούνται επί του παρόντος μέσα στις προδιαγραφές OpenType.

### Πίσω στους χαρακτήρες: Διαφορετικοί ρόλοι χαρακτήρων

Το σύνολο των χαρακτήρων που αποτελούν τα θεμελιώδη στοιχεία μιας γραφής (ή γλώσσας) δεν εκτελεί όλα τον ίδιο ρόλο. Για παράδειγμα, στις περισσότερες γλώσσες υπάρχουν χαρακτήρες για *τη στίξη*, χαρακτήρες για αριθμητικά *ψηφία* καθώς και οι χαρακτήρες που θεωρούμε ως *γράμματα* του αλφαβήτου, τα οποία, για ορισμένες γραφές, υπάρχουν επίσης σε κεφαλαία και πεζά μορφές. Η έννοια του χαρακτήρα είναι αρκετά ευρεία και το Πρότυπο Unicode περιλαμβάνει ειδικούς χαρακτήρες που *δεν έχουν σχεδιαστεί για να εμφανίζονται* αλλά η δουλειά τους είναι «να ελέγχουν την ερμηνεία ή την εμφάνιση του κειμένου». Για παράδειγμα, όταν στοιχειοθετείτε κάποιο αραβικό κείμενο μπορεί να θέλετε να επιβάλετε, ή να αποτρέψετε, τη συμπεριφορά σύνδεσης ορισμένων χαρακτήρων· το πρότυπο Unicode παρέχει ειδικούς χαρακτήρες ελέγχου για αυτό: τους λεγόμενους [ZERO WIDTH JOINER](https://en.wikipedia.org/wiki/Zero-width_joiner) και ο [ZERO WIDTH NON-JOINER](https://en.wikipedia.org/wiki/Zero-width_non-joiner). Αυτοί οι χαρακτήρες δεν προορίζονται για εμφάνιση και «απορροφώνται» από το λογισμικό κατά την επεξεργασία του κειμένου προκειμένου να παραχθούν τα επιθυμητά οπτικά αποτελέσματα.

Σε όλους τους χαρακτήρες που ορίζονται μέσα στο πρότυπο Unicode αποδίδεται ένα σύνολο ιδιοτήτων που, στην πράξη, περιγράφει τον ρόλο και τον σκοπό κάθε χαρακτήρα στην κωδικοποίηση Unicode—ονόματα χαρακτήρων, όπως το LATIN SMALL LETTER A, είναι μόνο ένα στοιχείο της λίστας ιδιοτήτων ενός χαρακτήρα. Αυτές οι ιδιότητες περιγράφονται πλήρως στη [Βάση Δεδομένων Χαρακτήρων Unicode (UCD)](http://www.unicode.org/reports/tr44/) και χρησιμοποιούνται ευρέως σε μηχανογραφημένες λειτουργίες επεξεργασίας κειμένου όπως η αναζήτηση, η ταξινόμηση, ο ορθογραφικός έλεγχος κ.ο.κ. Αρχεία δεδομένων που απαριθμούν τις ιδιότητες χαρακτήρων Unicode είναι επίσης [διαθέσιμα για λήψη](http://www.unicode.org/Public/UCD/latest/).

Μεταξύ των ιδιοτήτων που αποδίδονται σε κάθε χαρακτήρα, η πιο σημαντική για τη συζήτησή μας είναι ένα *αριθμητικό αναγνωριστικό* που αποδίδεται από την κωδικοποίησή του Unicode, ένα θέμα στο οποίο στρεφόμαστε τώρα.

### Χαρακτήρες: Αριθμοί και κωδικοποιήσεις

Είναι προφανές, αλλά οι υπολογιστές και άλλες ψηφιακές συσκευές ασχολούνται με την αποθήκευση και επεξεργασία αριθμητικών δεδομένων: πώς λοιπόν σχετίζεται αυτό με το κείμενο; Καθώς πληκτρολογείτε κάποιο κείμενο χρησιμοποιώντας ένα πληκτρολόγιο υπολογιστή ή αγγίζοντας την οθόνη μιας κινητής συσκευής, τα πατήματα των πλήκτρων μετατρέπονται σε αριθμούς που αντιπροσωπεύουν τη συμβολοσειρά χαρακτήρων που πληκτρολογείτε.

Κάποια στιγμή μπορεί να θέλετε να μεταφέρετε αυτό το κείμενο (μια ακολουθία αριθμών) μέσω e-mail, μηνύματος κειμένου ή μέσω διαδικτυακής επικοινωνίας όπως ένα Tweet ή μια ανάρτηση σε κάποια μορφή κοινωνικών μέσων. Είναι σαφές ότι η συσκευή στην οποία συντάξατε το κείμενο και η συσκευή/οι συσκευές που χρησιμοποιεί ο/οι παραλήπτης/ές του πρέπει, κατά κάποιον τρόπο, να συμφωνούν σχετικά με το ποιοι αριθμοί αντιπροσωπεύουν ποιοι χαρακτήρες. Αν όχι, το κείμενό σας μπορεί να μην εμφανιστεί σωστά στη συσκευή του παραλήπτη.

Για να λειτουργεί η σημερινή παγκόσμια επικοινωνία, οι συσκευές αποστολής και λήψης χρειάζονται κάποια «αμοιβαίως συμφωνημένη σύμβαση» μέσω της οποίας ένα συγκεκριμένο σύνολο αριθμών αντιπροσωπεύει ένα συγκεκριμένο σύνολο χαρακτήρων. Αυτή η σύμβαση ονομάζεται *κωδικοποίηση*: ένα σύνολο αριθμών που χρησιμοποιείται για να αντιπροσωπεύει ένα συγκεκριμένο σύνολο χαρακτήρων και η κωδικοποίηση Unicode είναι πλέον το *de facto* παγκόσμιο πρότυπο.

## Unicode: bits και bytes για την αποθήκευση κειμένου

Η Unicode είναι ένα τεράστιο πρότυπο που καλύπτει πολύ, πολύ περισσότερα από την απλή κωδικοποίηση κειμένου, αλλά εδώ επικεντρωνόμαστε μόνο στην κωδικοποίηση που παρέχει.

#### Bits, bytes και πόσοι χαρακτήρες;

Αναφέραμε ότι οι συσκευές αποθηκεύουν και αναπαριστούν κείμενο ως αριθμούς—συγκεκριμένα, οι χαρακτήρες θα αποθηκεύονται ως ακέραιοι αριθμοί: ολόκληροι αριθμοί. Για να κατανοήσουμε τις επιπτώσεις αυτού για την κωδικοποίηση Unicode, χρειαζόμαστε μια *πολύ* σύντομη, *πολύ* βασική, ανασκόπηση του πώς οι υπολογιστές αποθηκεύουν ακέραιους αριθμούς (δεν σκοπεύουμε να μπούμε στην επιστήμη των υπολογιστών).

Για να συντομεύσουμε μια πολύ μεγάλη ιστορία, οι σημερινές επιτραπέζιες ή φορητές συσκευές αποθηκεύουν ακέραιους σε διακριτά «κομμάτια» που μπορούν να έχουν μήκος 1, 2, 4 ή 8 bytes. Καθεμία από αυτές τις μονάδες αποθήκευσης μπορεί να αποθηκεύσει ακέραιους έως μια μέγιστη θετική τιμή με βάση τον συνολικό αριθμό bits που περιέχονται σε κάθε μονάδα αποθήκευσης:

* 1 byte (8 bits): ο μέγιστος θετικός ακέραιος είναι 255·
* 2 bytes (16 bits): ο μέγιστος θετικός ακέραιος είναι 65535·
* 4 bytes (32 bits): ο μέγιστος θετικός ακέραιος είναι 4,294,967,295·
* 8 bytes (64 bits): ο μέγιστος θετικός ακέραιος είναι 18,446,744,073,709,551,615.

Στην πράξη, το πρότυπο Unicode χρησιμοποιεί αριθμούς στο εύρος 0 έως 1,114,111 για να κωδικοποιήσει όλους τους χαρακτήρες του κόσμου, με αποτέλεσμα να χρειάζεται μόλις 21 bits για να κωδικοποιήσει ολόκληρο το εύρος. Μπορούμε να το δούμε αυτό παρατηρώντας ότι οι μονάδες αποθήκευσης που περιέχουν n bits μπορούν να αναπαραστήσουν οποιονδήποτε θετικό ακέραιο από το 0 έως μια μέγιστη τιμή $$2^n -1$$· επομένως:

* η μέγιστη τιμή που μπορεί να αποθηκευτεί σε 20 bits είναι $$2^{20} -1 = 1,048,575$$ (πολύ μικρή)·
* η μέγιστη τιμή που μπορεί να αποθηκευτεί σε 21 bits είναι $$2^{21} -1 = 2,097,151$$ (επαρκώς μεγάλη).

Έχουμε σημειώσει ότι οι υπολογιστές αποθηκεύουν δεδομένα (αριθμούς) σε μονάδες των 1, 2, 4 (ή 8) bytes, οπότε πόσο μεγάλη πρέπει να είναι η μονάδα αποθήκευσης αν πρέπει να αποθηκεύσουμε τιμές έως τη μέγιστη τιμή Unicode 1,114,111; Προφανώς, μια μονάδα αποθήκευσης μεγέθους ενός byte μπορεί να περιέχει μέγιστη τιμή 255 και 2 bytes μπορούν να αποθηκεύσουν 65535: καμία από αυτές δεν επαρκεί για να αποθηκεύσει ολόκληρο το εύρος χαρακτήρων που κωδικοποιούνται από το Unicode. Η επόμενη διαθέσιμη επιλογή είναι μονάδες αποθήκευσης μεγέθους 4 bytes, οι οποίες μπορούν να αποθηκεύσουν ακέραιους έως μέγιστη τιμή 4,294,967,295, πολύ περισσότερο από όσο θα χρειαζόμασταν στην πραγματικότητα. Άρα, αν επιλέγαμε 4 bytes ως μονάδα αποθήκευσής μας, σίγουρα θα είχαμε περισσότερο από αρκετό χώρο για να αποθηκεύσουμε όλες τις τιμές Unicode, με κάθε χαρακτήρα να αποθηκεύεται ως ακέραιος που απαιτεί 4 bytes (32 bits). Ωστόσο, η χρήση 4 bytes για την αποθήκευση όλων είναι εξαιρετικά σπάταλη σε χώρο, επειδή ακόμη και οι μεγαλύτερες τιμές Unicode χρειάζονται το πολύ 21 bits—κάτι που, αν αποθηκευόταν με 32 bits, θα σήμαινε ότι 11 από αυτά τα 32 bits δεν θα χρησιμοποιούνταν ποτέ.

**Σημείωση**: Αν και το εύρος Unicode εκτείνεται από το 0 έως το 1,114,111, δεν χρησιμοποιείται στην πραγματικότητα κάθε τιμή σε αυτό το εύρος: για τεχνικούς λόγους, ορισμένες τιμές θεωρούνται μη έγκυρες για πραγματική χρήση ως χαρακτήρες Unicode.

### Λοιπόν, τι είναι το UTF-8;

Αν διαβάσετε για το XeTeX ή το LuaTeX είναι σχεδόν βέβαιο ότι θα συναντήσετε εξηγήσεις που αναφέρουν ότι αυτές οι μηχανές TeX διαβάζουν κείμενο και αρχεία εισόδου LaTeX σε «μορφή UTF-8». Λοιπόν, τι είναι η «μορφή UTF-8» και πώς σχετίζεται με το Unicode; Στην ορολογία του Unicode, καθεμία από τις 1,114,112 τιμές της (που κυμαίνονται από 0 έως 1,114,111) που χρησιμοποιούνται για την κωδικοποίηση των χαρακτήρων του κόσμου ονομάζεται ένα [σημείο κώδικα](http://www.unicode.org/glossary/#code_point).

Έχουμε δει ότι, *θεωρητικά*, θα έπρεπε να αποθηκεύουμε όλο το κείμενό μας κωδικοποιημένο σε Unicode χρησιμοποιώντας 4 bytes ανά χαρακτήρα, ώστε να αναπαραστήσουμε ολόκληρο το εύρος των code points του Unicode. Ωστόσο, στην πράξη, κάποιοι αρκετά έξυπνοι άνθρωποι εφηύραν έναν απλό τρόπο να αναπαριστούν έναν μοναδικό αριθμό Unicode (code point) ως μια *ακολουθία* ακολουθία μικρότερων αριθμών, καθένας από αυτούς τους μικρότερους αριθμούς αποθηκεύεται σε ένα μόνο byte: μια διαδικασία που *μετατρέπει* έναν μόνο (μεγαλύτερο) ακέραιο σε μια ακολουθία μικρότερων (μεγέθους byte). Εξαιτίας αυτής της μετατροπής, οι χαρακτήρες του αρχείου κειμένου μας δεν αναπαρίστανται πλέον ο καθένας από μία μόνο αριθμητική τιμή: κάθε χαρακτήρας γίνεται μια *πολυ-byte ακολουθία*—οτιδήποτε από 1 έως 4 (συνεχόμενα) bytes στο αρχείο κειμένου μπορεί να αντιπροσωπεύει έναν μόνο μεμονωμένο χαρακτήρα Unicode (δηλαδή την τιμή του code point του).

Το UTF σημαίνει *Unicode Transformation Format* και η λέξη-κλειδί εδώ είναι *Μετασχηματισμός*. Ουσιαστικά, μπορείτε να θεωρήσετε το UTF-8 ως μια «συνταγή» ή αλγόριθμο για τη μετατροπή (transformation) μιας μοναδικής τιμής code point Unicode σε μια ακολουθία 1 έως 4 κομματιών μεγέθους byte. Καθώς αυξάνεται η τιμή του code point Unicode, αυξάνεται επίσης ο αριθμός των μεμονωμένων bytes που απαιτούνται για να αναπαρασταθεί σε μορφή UTF-8.

Υπάρχουν τεχνικοί και ιστορικοί λόγοι για τη δημιουργία του UTF-8 και η ιστορία πίσω από την εφεύρεση του UTF-8 [καταγράφεται σε ένα συναρπαστικό e-mail του 2003](https://www.cl.cam.ac.uk/~mgk25/ucs/utf-8-history.txt), το οποίο, κοντά στην αρχή του e-mail, περιέχει τη γραμμή:

> «Αυτό δεν είναι αλήθεια. Το UTF-8 σχεδιάστηκε, μπροστά στα μάτια μου, πάνω σε ένα χαρτοσερβίτσιο σε ένα ντάινερ στο Νιου Τζέρσεϊ ένα βράδυ του Σεπτεμβρίου περίπου το 1992.»

#### Ένα παράδειγμα: το αραβικό γράμμα ل

Ας πάρουμε ένα παράδειγμα του αραβικού γράμματος ل (Unicode όνομα ARABIC LETTER LAM), στο οποίο έχει αποδοθεί η τιμή code point Unicode 1604 (δεκαδικά) ή 0644 (δεκαεξαδικά): η αναπαράστασή του σε UTF-8 είναι η *δύο-byte* ακολουθία D9 84 (σε δεκαεξαδικό) ή, σε δεκαδικό, 217 132. Όταν χρησιμοποιούμε το UTF-8 ως μορφή αποθήκευσης κειμένου, αντί ένα αρχείο κειμένου να περιέχει τον μοναδικό αριθμό 1604 για να αναπαραστήσει το ل, αυτό μετατρέπεται σε δύο τιμές μεγέθους byte: 217 και 132—ο χαρακτήρας ل αποθηκεύεται ως μια *ακολουθία δύο bytes*. Οι αναγνώστες που θέλουν να εξερευνήσουν τον αλγόριθμο UTF-8 με περισσότερες λεπτομέρειες μπορούν να βρουν μια αναλυτική εξήγηση και κώδικα C στο [προσωπικό ιστολόγιο](http://www.readytext.co.uk/?p=1284).

Όταν ένα κομμάτι λογισμικού (π.χ., το XeTeX ή το LuaTeX) διαβάζει κείμενο σε μορφή UTF-8, το λογισμικό αυτό πρέπει να προσδιορίσει την τιμή Unicode για κάθε χαρακτήρα που υπάρχει σε εκείνο το αρχείο, οπότε χρησιμοποιεί έναν αλγόριθμο για να *αντιστρέψει* την αντίστροφη διαδικασία μετατροπής UTF-8. Μέσω αυτού του «αλγορίθμου αντιστροφής» τα δύο bytes (217 και 132) επανασυνδυάζονται για να παραγάγουν τον ακέραιο 1604, ο οποίος μπορεί στη συνέχεια να αναγνωριστεί ως η τιμή code point Unicode για το αραβικό γράμμα ل.

Άρα, ως συμπέρασμα, το UTF-8 είναι πραγματικά απλώς μια ενδιάμεση μορφή δεδομένων που χρησιμοποιείται για την αποθήκευση και τη μετάδοση κειμένου κωδικοποιημένου σε Unicode.

**Σημείωση**: Ορισμένα συστήματα επιλέγουν να χρησιμοποιούν/αποθηκεύουν κείμενο χρησιμοποιώντας 32 bits ανά χαρακτήρα, αυτό ονομάζεται [UTF-32](https://en.wikipedia.org/wiki/UTF-32)—υπάρχει επίσης το [UTF-16](https://en.wikipedia.org/wiki/UTF-16) αλλά το UTF-8 είναι ο πιο συνηθισμένος τρόπος αποθήκευσης κειμένου κωδικοποιημένου σε Unicode.

## Πολυγλωσσικά αρχεία TeX: XeTeX και LuaTeX

Τόσο το XeTeX όσο και το LuaTeX είναι ικανά για πολύ εξελιγμένη πολυγλωσσική στοιχειοθεσία, αν και οι μηχανισμοί τους για την επίτευξή της είναι μάλλον διαφορετικοί και αντανακλούν τη φιλοσοφία σχεδιασμού/ανάπτυξης κάθε μηχανής. Δεν θα το εξερευνήσουμε σε βάθος αλλά απλώς θα σημειώσουμε ότι η μηχανή XeTeX περιέχει συνιστώσες λογισμικού (ενσωματωμένες στο εκτελέσιμό της) που δεν υπάρχουν στο LuaTeX—ιδίως λογισμικό για μια διαδικασία που ονομάζεται *διαμόρφωση OpenType* (π.χ. μέσω μιας βιβλιοθήκης που ονομάζεται [HarfBuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/)).

Σε αντίθεση, το LuaTeX υιοθετεί μια διαφορετική προσέγγιση: αντί να ενσωματώνει δυνατότητες απευθείας στην ίδια τη μηχανή TeX, το LuaTeX παρέχει μια εξαιρετικά πλούσια συλλογή εντολών (πρωτογενών εντολών TeX) και ένα πολύ ισχυρό [API βασισμένο στη Lua](/latex/el/se-vathos-arthra/07-an-introduction-to-luatex-part-1-what-is-it-and-what-makes-it-so-different.md) μέσω του οποίου οι προγραμματιστές μπορούν να κατασκευάσουν εξίσου προηγμένες λύσεις για πολυγλωσσική στοιχειοθεσία. Αν και η φιλοσοφία του LuaTeX μπορεί να συνεπάγεται επιπλέον εργασία για τους προγραμματιστές πακέτων LaTeX, προσφέρει πολύ μεγαλύτερη ευελιξία επειδή οι λύσεις δεν είναι «σκληροκωδικοποιημένες» στην ίδια τη μηχανή LuaTeX, αλλά κατασκευάζονται από κώδικα TeX και Lua—ή από πρόσθετα γραμμένα σε C/C++.

**Παρένθεση**: Οι αναγνώστες που επιθυμούν να εξερευνήσουν περαιτέρω τον συναρπαστικό, αλλά σύνθετο, κόσμο της διαμόρφωσης OpenType μπορεί να ενδιαφέρονται να διαβάσουν για την εξαιρετική βιβλιοθήκη ανοικτού κώδικα που ονομάζεται [HarfBuzz](https://www.freedesktop.org/wiki/Software/HarfBuzz/)—χρησιμοποιείται από πολλές εφαρμογές, συμπεριλαμβανομένων των Firefox, Chrome και LibreOffice και, φυσικά, από το XeTeX. Ο συγγραφέας αυτού του άρθρου έχει χρησιμοποιήσει το HarfBuzz για να δημιουργήσει [πρόσθετα LuaTeX για αραβική στοιχειοθεσία](http://www.readytext.co.uk/?p=3186).

Σήμερα είναι συνηθισμένο πλέον (π.χ., στα κοινωνικά μέσα) να μεταδίδεται κείμενο που περιέχει χαρακτήρες από πολλές γλώσσες και ένα αρχείο κειμένου UTF-8 που αποθηκεύει πολυγλωσσικό κείμενο μπορεί εύκολα να περιέχει χαρακτήρες των οποίων η αναπαράσταση σε UTF-8 έχει μήκος 1, 2, 3 ή 4 bytes. Έτσι, στην πράξη, ένα αρχείο κειμένου UTF-8 είναι απλώς μια ροή μεμονωμένων bytes, αλλά κάθε πραγματικός χαρακτήρας σε αυτό το αρχείο θα μπορούσε να έχει μήκος από 1 έως 4 bytes: οι μεμονωμένοι χαρακτήρες έχουν γίνει *πολυ-byte ακολουθίες*.

Για να εξερευνήσουμε περαιτέρω ορισμένες βασικές πτυχές της εργασίας με πολυγλωσσικό (στοιχειοθετημένο) κείμενο θα χρησιμοποιήσουμε ένα παράδειγμα που περιέχει την αραβική γραφή επειδή τα αραβικά μάς προσφέρουν περιθώριο για να αντιμετωπίσουμε πολλαπλές έννοιες.

#### Παρένθεση: η αραβική γραφή

Η [Η αραβική γραφή](https://en.wikipedia.org/wiki/Arabic_script) γράφεται με καλλιγραφικό ύφος και διαβάζεται και γράφεται από τα δεξιά προς τα αριστερά. Κάθε αραβικό γράμμα μπορεί, ενδεχομένως, να υιοθετήσει μία από 4 διαφορετικές μορφές σύμφωνα με:

* το αν εμφανίζεται ως μόνο, μεμονωμένος (απομονωμένος), χαρακτήρας (μη συνδεδεμένος με τίποτε άλλο)·
* το αν εμφανίζεται μέσα σε μια λέξη—στην αρχή, στη μέση ή στο τέλος μιας λέξης: αναφέρεται ως *αρχικές*, *μεσαίες* και *final* μορφές αντίστοιχα.

Κάθε χαρακτήρας της αραβικής γραφής έχει το δικό του σύνολο κανόνων σύνδεσης και μπορεί, ή και όχι, να αλλάξει μορφή/εμφάνιση όταν έχει έναν άλλο χαρακτήρα στα αριστερά του, στα δεξιά του ή στα αριστερά και δεξιά του. Οι αναγνώστες που ενδιαφέρονται να το εξερευνήσουν περαιτέρω μπορούν να βρουν μια [πλήρη λίστα στη Wikipedia](https://en.wikipedia.org/wiki/Template:Arabic_alphabet_shapes/joining).

#### Παράδειγμα: αραβικό και αγγλικό κείμενο σε UTF-8

Ας υποθέσουμε ότι δημιουργούμε ένα αρχείο κειμένου UTF-8 που περιέχει μία μόνο γραμμή αγγλικού και αραβικού κειμένου: This is العَرَبِيَّة text!

Αυτή η γραμμή κειμένου περιέχει 3 χαρακτήρες κενών, 11 αγγλικούς χαρακτήρες (λατινικής γραφής) και 12 αραβικούς χαρακτήρες (αν και αυτό μπορεί να μην είναι αμέσως προφανές/ορατό). Όταν αποθηκευτεί ως αρχείο κειμένου UTF-8 καταλαμβάνει 38 bytes αποθήκευσης, που προκύπτουν από τα εξής:

* **Λατινική γραφή**: κενά συν αγγλικό κείμενο: 14 ✕ χαρακτήρες 1 byte = 14 bytes·
* **Η αραβική γραφή**: 12 αραβικοί χαρακτήρες ✕ 2 bytes ανά χαρακτήρα = 24 bytes.

Σύνολο 14 + 24 = 38 bytes.

#### Βαθύτερη εξέταση

Αν αποθηκεύσουμε το παράδειγμα κείμενό μας σε ένα αρχείο UTF-8 με όνομα `arabic.txt` και το ανοίξουμε σε έναν δεκαεξαδικό επεξεργαστή μπορούμε να το εξετάσουμε για να δούμε τα πραγματικά bytes που περιέχει. Από τη μελέτη του παρακάτω σχολιασμένου στιγμιότυπου οθόνης μπορείτε να δείτε ότι το αραβικό κείμενο αποθηκεύεται ως 2 bytes ανά χαρακτήρα:

![Ένα αρχείο κειμένου UTF-8 που περιέχει αγγλικό και αραβικό κείμενο ανοιγμένο μέσα σε έναν δεκαεξαδικό επεξεργαστή.](/files/b97052969755827cd932466c779538f6cff672d6)

Ένα αρχείο κειμένου UTF-8 που περιέχει αγγλικό και αραβικό κείμενο ανοιγμένο μέσα σε έναν δεκαεξαδικό επεξεργαστή. Μπορείτε καθαρά να δείτε ότι οι χαρακτήρες λατινικής γραφής απαιτούν ένα μόνο byte, ενώ οι χαρακτήρες αραβικής γραφής αποθηκεύονται χρησιμοποιώντας δύο bytes ανά χαρακτήρα.

Μπορείτε να κάνετε μερικές παρατηρήσεις από αυτό το στιγμιότυπο οθόνης:

* το αραβικό κείμενο αποθηκεύεται σε ακολουθία από αριστερά προς τα δεξιά και οι χαρακτήρες είναι οι ακατέργαστες, μη διαμορφωμένες (απομονωμένες) εκδοχές των αραβικών γραμμάτων και φωνηέντων·
* δεν υπάρχει πρόσθετη πληροφορία μετά το λατινικής γραφής «This is » για να ενημερώσει οποιοδήποτε λογισμικό που διαβάζει αυτό το αρχείο ότι ο επόμενος χαρακτήρας είναι στην αραβική γραφή.

Αν στοιχειοθετείτε ένα πολύγλωσσο έγγραφο (π.χ., που περιέχει αγγλικά και αραβικά), τότε κατά την ανάγνωση/επεξεργασία του αρχείου κειμένου εισόδου (ως ροής bytes) το XeTeX ή το LuaTeX πρέπει να είναι σε θέση να ανιχνεύσει την αρχή και το τέλος κάθε χαρακτήρα και να διαβάσει τον σωστό αριθμό bytes που απαιτούνται για να αντιστρέψει τη μετατροπή UTF-8 και να παραγάγει το αντίστοιχο code point Unicode. Είναι ο ίδιος ο αλγόριθμος UTF-8 που επιτρέπει στο λογισμικό να το κάνει αυτό: επιτρέποντας την ανίχνευση του πρώτου byte κάθε μεμονωμένου χαρακτήρα και του πόσα bytes πρέπει να διαβαστούν ώστε να υπολογιστεί το αντίστοιχο code point Unicode. Το UTF-8 είναι απλό στη χρήση, αλλά πραγματικά αρκετά ευφυές.

#### Λογική σειρά, σειρά εμφάνισης και διαμόρφωση OpenType

Αν κοιτάξετε προσεκτικά το αραβικό κείμενο παραπάνω (العَرَبِيَّة) ίσως είναι δύσκολο να δείτε ότι το αρχείο κειμένου μας περιέχει πράγματι 12 μεμονωμένους αραβικούς χαρακτήρες—ιδιαίτερα αν δεν είστε εξοικειωμένοι με την αραβική γραφή! Ωστόσο, αν μετρήσετε προσεκτικά τους αραβικούς χαρακτήρες που εμφανίζονται στη δεξιά πλευρά του παραπάνω στιγμιότυπου οθόνης μπορείτε να δείτε ότι είναι συνολικά 12.

Για γλώσσες με σύνθετη γραφή, όπως τα αραβικά, αυτό που το αρχείο κειμένου μας *αποθηκεύει* και αυτό που εσείς *βλέπετε στην οθόνη* είναι οπτικά *πολύ* τελείως διαφορετικά! Αυτό που βλέπετε όταν προβάλλετε αυτό το κείμενο, ας πούμε, σε έναν φυλλομετρητή, είναι (ανάλογα με τη γραμματοσειρά που χρησιμοποιείται):

![Εικόνα στοιχειοθετημένου αραβικού κειμένου](/files/568141c408eb5a80fe49f1afade1db859eb48c36)

Όμως, όπως δείχνει το παραπάνω στιγμιότυπο οθόνης, αυτό που πραγματικά περιέχει το αρχείο κειμένου UTF-8 είναι αυτό:

![Εικόνα μη στοιχειοθετημένου αραβικού κειμένου (απομονωμένοι χαρακτήρες)](/files/45536c7abe764263e6a3abcfcbd86235c3f71a6f)

Ακόμη κι αν δεν είστε εξοικειωμένοι με την καλλιγραφική φύση της αραβικής γραφής μπορείτε καθαρά να δείτε ότι «κάτι» έχει συμβεί κατά τη διαδικασία μεταφοράς των αραβικών χαρακτήρων που περιέχονται σε ένα αρχείο κειμένου προς τη στοιχειοθεσία και/ή την εμφάνιση στην οθόνη (ως γλυφών). Αν έχετε συνηθίσει να χρησιμοποιείτε TeX/LaTeX με γλώσσες απλής γραφής, για παράδειγμα γλώσσες βασισμένες στη λατινική γραφή, αυτό μπορεί πράγματι να είναι πολύ μπερδεμένο!

Μερικές σημαντικές έννοιες παίζουν ρόλο εδώ επειδή τα αρχεία κειμένου Unicode ασχολούνται με την αποθήκευση… λοιπόν, κειμένου (Unicode), και τα συστήματα στοιχειοθεσίας και εμφάνισης ασχολούνται με τη χρήση γραμματοσειρών και γλυφών (OpenType):

* το αρχείο κειμένου αποθήκευσε τους αραβικούς χαρακτήρες με σειρά από αριστερά προς τα δεξιά, αλλά τα αραβικά διαβάζονται/εμφανίζονται από τα δεξιά προς τα αριστερά: τα αρχεία κειμένου αποθηκεύουν κείμενο στη λεγόμενη *λογική σειρά*;
* το αρχείο κειμένου περιέχει μεμονωμένους χαρακτήρες που φαίνονται πολύ διαφορετικοί από την πραγματική εμφάνιση που παρουσιάζεται στην οθόνη: το αρχείο κειμένου περιέχει τους αραβικούς χαρακτήρες στη μεμονωμένη, μη συνδεδεμένη, μορφή τους.

#### Τι συμβαίνει εδώ;

Μέσα σε ένα αρχείο κειμένου τα αραβικά αποθηκεύονται ως ακολουθία από αριστερά προς τα δεξιά χαρακτήρων σε απομονωμένη μορφή: αν το σκεφτείτε, το αρχείο κειμένου αποθηκεύει το αραβικό κείμενο με τη σειρά/ακολουθία *με την οποία πληκτρολογήθηκε* (το *λογική σειρά*). *οπτική σειρά* ή *σειρά εμφάνισης*; επιπλέον, οι απομονωμένες μορφές των αραβικών χαρακτήρων *διαμορφώνονται* στις τυπογραφικά σωστές εκδοχές εμφάνισής τους. Ένας τρόπος να το σκεφτείτε είναι ότι ένα απλό αρχείο κειμένου πρέπει να αποθηκεύει κείμενο (Unicode χαρακτήρες) στην πιο βασική δυνατή μορφή: ακατέργαστους, μη διαμορφωμένους, μεμονωμένους χαρακτήρες κειμένου—είναι καθήκον του λογισμικού του συστήματος να αποδίδει αυτούς τους χαρακτήρες για εμφάνιση με βάση το λειτουργικό σύστημα, τις γραμματοσειρές και το λογισμικό στοιχειοθεσίας/απόδοσης που είναι διαθέσιμα στη συσκευή προβολής.

Όταν το αραβικό κείμενο σε εκείνο το αρχείο στοιχειοθετείται/εμφανίζεται, υφίσταται μια διαδικασία που ονομάζεται *σχηματοποίηση*διαμόρφωση OpenType. *διαμόρφωση OpenType*—μια διαδικασία που περιλαμβάνει ένα ευρύ φάσμα τυπογραφικών λειτουργιών, οι οποίες μπορεί να περιλαμβάνουν:

* την αντικατάσταση πολλαπλών μεμονωμένων γλυφών με έναν ενιαίο σύνθετο συνδετικό γλύφο (πολύ συνηθισμένο στα Αραβικά), ή
* λειτουργίες τοποθέτησης που, για παράδειγμα, προσαρμόζουν τις θέσεις των αραβικών φωνηέντων ανάλογα με το ποιο γλύφο βρίσκονται πάνω ή κάτω από.

![Εικόνα που δείχνει τον μετασχηματισμό που υφίσταται το αραβικό κείμενο όταν στοιχειοθετείται](/files/f04a96d2e89b850f80ae14b6af659a20018a90df)

Η διαφορά μεταξύ λογικής σειράς και οπτικής (εμφανιζόμενης) σειράς. Σε αυτό το γραφικό μπορείτε να δείτε ότι οι αραβικοί χαρακτήρες που αποθηκεύονται σε ένα αρχείο κειμένου υφίστανται αναδιάταξη και διαμόρφωση όταν προβάλλονται ή στοιχειοθετούνται.

Οι σχεδιαστές και δημιουργοί προηγμένων γραμματοσειρών OpenType επενδύουν πολύ σημαντικό χρόνο και εξειδίκευση ώστε να προσφέρουν τις εξελιγμένες τυπογραφικές δυνατότητες ενσωματωμένες στις γραμματοσειρές τους.

Για να απενεργοποιήσουμε τη διαμόρφωση που εφαρμόζεται στο αραβικό κείμενο μπορούμε να χρησιμοποιήσουμε το εξαιρετικό, δωρεάν, [BabelPad](http://www.babelstone.co.uk/Software/BabelPad.html) επεξεργαστή κειμένου Unicode (μόνο για Windows), ο οποίος σας επιτρέπει να απενεργοποιήσετε τη διαμόρφωση ώστε να δείτε τους ακατέργαστους, μεμονωμένους, μη ενωμένους (αδιαμόρφωτους) χαρακτήρες που όντως υπάρχουν στο αρχείο κειμένου—δείτε το κάτω μισό αυτού του συνδυασμένου στιγμιότυπου οθόνης:

![Εικόνα που δείχνει τη δυνατότητα του επεξεργαστή κειμένου BabelPad να απενεργοποιεί τη διαμόρφωση OpenType](/files/c96ae14ed08d66b7ce8562726731a8926af5d1f9)

Χρησιμοποιώντας τον επεξεργαστή κειμένου Unicode BabelPad για να ενεργοποιήσετε τη διαμόρφωση OpenType (επάνω σχήμα) ή να την απενεργοποιήσετε (κάτω σχήμα). Η απενεργοποίηση της διαμόρφωσης OpenType κάνει πολύ ευκολότερη την επεξεργασία αραβικού κειμένου.

Οι έννοιες της λογικής σειράς και της σειράς εμφάνισης, σε συνδυασμό με τις διαδικασίες διαμόρφωσης, μπορεί να είναι αρκετά μπερδεμένες όταν τις συναντάτε για πρώτη φορά κατά την επεξεργασία ή τη στοιχειοθεσία με πολυγλωσσικά αρχεία κειμένου που περιέχουν σύνθετα συστήματα γραφής όπως τα Αραβικά: ελπίζουμε τα παραπάνω να βοήθησαν στην αποφυγή κάποιας αρχικής σύγχυσης.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://overleaf-pro.ayaka.space/latex/el/se-vathos-arthra/51-unicode-utf-8-and-multilingual-text-an-introduction.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
