Η βάση των βασικών είναι η κωδικοποίηση ASCII και οι σύγχρονες ερμηνείες της. Επίλυση προβλημάτων με λανθασμένη κωδικοποίηση ιστοσελίδας

Εάν η ακολουθία των bit δεν φαίνεται λογική (από ανθρώπινη άποψη), τότε αυτή είναι μια περίπτωση όπου το έγγραφο πιθανότατα μετατράπηκε εσφαλμένα κάποια στιγμή. Για παράδειγμα, παίρνουμε το κείμενο ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ και, χωρίς να σκεφτόμαστε κάτι καλύτερο, το αποθηκεύουμε στο UTF-8. Ο επεξεργαστής κειμένου υπέθεσε ότι διάβασε σωστά το κείμενο με κωδικοποίηση Mac Roman και τώρα πρέπει να αποθηκευτεί σε διαφορετική κωδικοποίηση. Άλλωστε όλοι αυτοί οι χαρακτήρες ισχύουν στο Unicode. Εννοώ, το Unicode έχει μια ρήτρα για É, για G, και ούτω καθεξής. Οπότε το αποθηκεύουμε σε UTF-8:

11000011 10001001 01000111 11000011 10001001 11000011 10101100 11000011 10001001 01010010 11000011 10000101 01011011 11000011 10001001 01100110 11000011 10001001 01000010 11000011 10001001 11000011 10101100 11000011 10001001 01001111 11000011 10000111 11000011 10010101 11000011 10101100 11000011 10010100 11000011 10000111 11000010 10110101 11000011 10000111 11100010 10001001 10100000 11000011 10000111 11000010 10111011 11000011 10000111 11000010 10100010

Έτσι το κείμενο ÉGÉìÉRÅ[ÉfÉBÉìÉOÇÕìÔǵÇ≠ǻǢ αναπαρίσταται τώρα ως ακολουθία UTF-8 bit. Αυτή η ακολουθία δυαδικών ψηφίων είναι εντελώς διαχωρισμένη από αυτό που υπήρχε στο αρχικό έγγραφο. Ανεξάρτητα από την κωδικοποίηση που χρησιμοποιούμε για να ανοίξουμε αυτήν την ακολουθία, δεν θα δούμε ποτέ το αρχικό κείμενο エンコーディングは難しくない. Απλώς έχει χαθεί. Θα μπορούσε να αποκατασταθεί εάν γνωρίζαμε την αρχική κωδικοποίηση Shift-JIS και ότι αντιμετωπίζαμε το κείμενο ως Mac Roman και στη συνέχεια το αποθηκεύαμε ως UTF-8. Αλλά τέτοια θαύματα είναι σπάνια.

Πολλές φορές μια συγκεκριμένη ακολουθία bit είναι εσφαλμένη σε μια συγκεκριμένη κωδικοποίηση. Εάν προσπαθούσαμε να ανοίξουμε το αρχικό έγγραφο σε ASCII, θα βλέπαμε ότι ορισμένοι χαρακτήρες αναγνωρίζονταν, αλλά άλλοι όχι. Το πρόγραμμα που χρησιμοποιείτε μπορεί να αποφασίσει απλώς να πετάξει τα byte που δεν ταιριάζουν στην τρέχουσα κωδικοποίηση ή να τα αντικαταστήσει με ερωτηματικά. Ή με έναν ειδικό χαρακτήρα αντικατάστασης Unicode: � (U+ FFFD). Εάν αποθηκεύσετε το έγγραφο μετά τη διαδικασία αφαίρεσης ακατάλληλων χαρακτήρων, θα τους χάσετε για πάντα.

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

Και πώς να αλλάξω σωστά τις κωδικοποιήσεις;

Είναι πραγματικά απλό! Πρέπει να γνωρίζετε την κωδικοποίηση ενός συγκεκριμένου τμήματος κειμένου (ακολουθία bit) και να το χρησιμοποιήσετε για να το αποκρυπτογραφήσετε. Αυτό είναι το μόνο που υπάρχει σε αυτό. Εάν γράφετε ένα πρόγραμμα που λαμβάνει κείμενο από τον χρήστη, καθορίστε σε ποια κωδικοποίηση θα το κάνει αυτό. Οποιοδήποτε πεδίο κειμένου πρέπει να γνωρίζει σε ποια κωδικοποίηση δέχεται δεδομένα. Για κάθε τύπο αρχείου που ένας χρήστης μπορεί να φορτώσει σε ένα πρόγραμμα, πρέπει να οριστεί μια κωδικοποίηση. Ή θα πρέπει να υπάρχει ένας τρόπος να ρωτήσετε τον χρήστη σχετικά. Οι πληροφορίες μπορεί να παρέχονται από τη μορφή αρχείου ή από τον χρήστη (οι περισσότεροι από αυτούς είναι απίθανο να γνωρίζουν μέχρι να ολοκληρώσουν την ανάγνωση του άρθρου, φυσικά).

Εάν πρέπει να μετατρέψετε κείμενο από μια κωδικοποίηση σε άλλη, χρησιμοποιήστε το ειδικά εργαλεία. Η μετατροπή είναι η κουραστική εργασία της σύγκρισης δύο σελίδων κώδικα και της απόφασης ότι ο χαρακτήρας 152 στην κωδικοποίηση Α είναι ο ίδιος με τον χαρακτήρα 4122 στην κωδικοποίηση Β, και στη συνέχεια αλλάζοντας τα bit. Δεν χρειάζεται να εφεύρουμε ξανά τον τροχό: κάθε κοινή γλώσσα προγραμματισμού έχει αφηρημένα εργαλεία bit και κωδικοσελίδων για τη μετατροπή κειμένου από κωδικοποίηση σε κωδικοποίηση.

Ας υποθέσουμε ότι η εφαρμογή σας πρέπει να δέχεται αρχεία σε GB18030, αλλά εσωτερικά εκτελείτε σε UTF-32. Το εργαλείο iconv μπορεί να κάνει τη μετατροπή σε μία γραμμή: iconv("GB18030", "UTF-32", $string). Οι χαρακτήρες θα παραμείνουν οι ίδιοι παρόλο που η αναπαράσταση bit έχει αλλάξει.

χαρακτήρας GB18030 με κωδικοποίηση Κωδικοποίηση UTF-32
縧 10111111 01101100 00000000 00000000 01111110 00100111

Αυτό είναι όλο. Το περιεχόμενο της συμβολοσειράς στην ανθρώπινη κατανόησή της δεν έχει αλλάξει, αλλά είναι πλέον μια έγκυρη συμβολοσειρά UTF-32. Εάν συνεχίσετε να εργάζεστε με αυτό στο UTF-32, δεν θα έχετε κανένα πρόβλημα αδιάβαστους χαρακτήρες. Ωστόσο, όπως συζητήσαμε νωρίτερα, δεν είναι όλες οι κωδικοποιήσεις ικανές να εμφανίζουν όλους τους χαρακτήρες. Δεν είναι δυνατή η κωδικοποίηση του χαρακτήρα 縧 σε καμία από τις ευρωπαϊκές γλωσσικές κωδικοποιήσεις. Και μπορεί να συμβεί κάτι τρομερό.

Όλα είναι στο Unicode

Αυτός είναι ο λόγος που δεν υπάρχει καμία δικαιολογία στον 21ο αιώνα για να μην χρησιμοποιήσετε το Unicode. Ορισμένες εξειδικευμένες κωδικοποιήσεις για ευρωπαϊκές γλώσσες μπορεί να είναι πιο αποτελεσματικές από το Unicode για συγκεκριμένη γλώσσα. Αλλά εφόσον δεν χρειάζεται να δουλέψετε με terabytes ειδικού κειμένου (που είναι ΠΟΛΥ), δεν χρειάζεται να ανησυχείτε για αυτό. Τα προβλήματα που προκύπτουν από μη συμβατές κωδικοποιήσεις είναι πολύ χειρότερα από ένα χαμένο gigabyte. Και αυτό το επιχείρημα θα γίνει πιο ισχυρό καθώς η αποθήκευση δεδομένων και το πλάτος του καναλιού μεγαλώνουν και γίνονται φθηνότερα.

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

Χαρούμενα ατυχήματα
Είχα έναν ιστότοπο συνδεδεμένο με μια βάση δεδομένων. Η εφαρμογή μου επεξεργάστηκε τα πάντα ως UTF-8 και τα αποθήκευσε στη βάση δεδομένων ως τέτοια, και όλα ήταν υπέροχα, αλλά όταν μπήκα στην περιοχή διαχείρισης της βάσης δεδομένων, δεν μπορούσα να καταλάβω τίποτα.
- ανώνυμος κωδικοποιητής redneck

Προκύπτουν καταστάσεις όταν οι κωδικοποιήσεις υποβάλλονται σε λανθασμένη επεξεργασία, αλλά όλα λειτουργούν καλά. Συχνά συμβαίνει ότι η κωδικοποίηση της βάσης δεδομένων έχει οριστεί σε latin-1, αλλά η εφαρμογή λειτουργεί με UTF-8 (ή οποιοδήποτε άλλο). Σε γενικές γραμμές, οποιοσδήποτε συνδυασμός 1 και 0 είναι έγκυρος σε single-byte Latin-1. Εάν η βάση δεδομένων λαμβάνει δεδομένα από μια εφαρμογή όπως το 11100111 10111000 10100111, τότε τα αποθηκεύει ευτυχώς, νομίζοντας ότι η εφαρμογή σήμαινε 縧. Γιατί όχι? Αργότερα, η βάση δεδομένων επιστρέφει τα ίδια bits στην εφαρμογή, η οποία είναι χαρούμενη επειδή έλαβε τον χαρακτήρα UTF-8 縧 που προοριζόταν. Αλλά η διεπαφή διαχείρισης της βάσης δεδομένων γνωρίζει ότι χρησιμοποιείται το Latin-1, και αυτό είναι το αποτέλεσμα: τίποτα δεν μπορεί να γίνει κατανοητό.
Ο ανόητος απλώς κέρδισε το λαχείο, αν και τα αστέρια δεν ήταν με το μέρος του. Οποιαδήποτε λειτουργία σε κείμενο στη βάση δεδομένων μπορεί να λειτουργήσει, αλλά μπορεί να μην εκτελεστεί όπως προβλέπεται, καθώς η βάση δεδομένων δεν αντιλαμβάνεται σωστά το κείμενο. Στη χειρότερη περίπτωση, η βάση δεδομένων θα καταστρέψει κατά λάθος όλο το κείμενο, εκτελώντας μια αυθαίρετη λειτουργία 2 χρόνια μετά την εγκατάσταση λόγω λανθασμένης κωδικοποίησης (και φυσικά, χωρίς αντίγραφο ασφαλείας για εσάς).

UTF-8 και ASCII

Η ιδιοφυΐα του UTF-8 είναι η δυαδική συμβατότητά του με το ASCII, το οποίο είναι η de facto βάση για όλες τις κωδικοποιήσεις. Όλοι οι χαρακτήρες ASCII καταλαμβάνουν το μέγιστο byte στο UTF-8 και χρησιμοποιούν τα ίδια bit όπως στο ASCII. Με άλλα λόγια, το ASCII μπορεί να αντιστοιχιστεί 1:1 στο UTF-8. Οποιοσδήποτε χαρακτήρας που δεν είναι ASCII καταλαμβάνει 2 ή περισσότερα byte στο UTF-8. Οι περισσότερες γλώσσες προγραμματισμού που χρησιμοποιούν ASCII ως κωδικοποίηση πηγαίος κώδικας, σας επιτρέπει να συμπεριλάβετε κείμενο UTF-8 απευθείας στο κείμενο:

Η αποθήκευση στο UTF-8 θα δώσει την ακολουθία:

00100100 01110011 01110100 01110010 01101001 01101110 01100111 00100000
00111101 00100000 00100010 11100110 10111100 10100010 11100101 10101101
10010111 00100010 00111011

Μόνο 12 byte από τα 17 (αυτά που ξεκινούν με 1) είναι χαρακτήρες UTF-8 (2 χαρακτήρες των 3 byte). Άλλοι χαρακτήρες είναι σε ASCII. Ο αναλυτής θα διαβάσει τα εξής:

$string = "11100110 10111100 10100010 11100101 10101101 10010111";

Ο αναλυτής αντιμετωπίζει τα πάντα πίσω από το απόσπασμα ως μια ακολουθία bits που πρέπει να αντιμετωπίζονται ως έχουν, μέχρι το άλλο απόσπασμα. Εάν απλώς εξάγετε αυτήν την ακολουθία, θα εξάγετε το κείμενο σε UTF-8. Δεν χρειάζεται να κάνετε κάτι άλλο. Ο αναλυτής δεν χρειάζεται να υποστηρίζει συγκεκριμένα το utf-8, απλά πρέπει να παίρνει τις συμβολοσειρές κυριολεκτικά. Οι απλοί αναλυτές μπορούν να υποστηρίξουν το Unicode με αυτόν τον τρόπο χωρίς να υποστηρίζουν πραγματικά το Unicode. Ωστόσο, πολλές γλώσσες προγραμματισμού υποστηρίζουν ρητά το Unicode.

Κωδικοποιήσεις και PHP.

Η PHP δεν υποστηρίζει Unicode. Είναι αλήθεια ότι το υποστηρίζει αρκετά καλά. Η προηγούμενη παράγραφος δείχνει πώς να συμπεριλάβετε χαρακτήρες UTF-8 απευθείας στο κείμενο του προγράμματος χωρίς κανένα πρόβλημα, επειδή το UTF-8 είναι συμβατό με ASCII και αυτό είναι το μόνο που χρειάζεται η PHP. Ωστόσο, η δήλωση ότι "Η PHP δεν υποστηρίζει Unicode" είναι αλήθεια και έχει προκαλέσει μεγάλη σύγχυση στην κοινότητα της PHP.

Ψεύτικες υποσχέσεις

Ένα από τα pet peeves μου ήταν οι συναρτήσεις utf8_encode και utf8_decode. Βλέπω συχνά ανόητα πράγματα όπως "Για να χρησιμοποιήσετε Unicode στην PHP, πρέπει να καλέσετε το utf8_encode στο κείμενο εισόδου και το utf8_decode στην έξοδο." Αυτές οι δύο λειτουργίες υπόσχονται κάποιο είδος αυτόματης μετατροπής κειμένου UTF-8, το οποίο υποτίθεται ότι απαιτείται, επειδή «η PHP δεν υποστηρίζει Unicode». Εάν διαβάζετε αυτό το άρθρο όχι διαγώνια, τότε το γνωρίζετε

  1. Δεν υπάρχει τίποτα ιδιαίτερο για το UTF-8
  2. Δεν μπορείτε να κωδικοποιήσετε κείμενο σε UTF-8 εκ των υστέρων

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

Το κείμενο είναι είτε κωδικοποιημένο UTF-8 είτε χωρίς κωδικοποίηση. Αν όχι, τότε είναι κωδικοποιημένο σε ASCII, ISO-8859-1, UTF-16 ή κάτι άλλο. Αν δεν είναι σε UTF-8, αλλά υποτίθεται ότι περιέχει "UTF-8 χαρακτήρες", τότε έχετε γνωστική ασυμφωνία. Εάν το κείμενο εξακολουθεί να περιέχει τους απαραίτητους χαρακτήρες κωδικοποιημένους σε UTF-8, τότε είναι σε UTF-8.

Τι στο διάολο κάνει λοιπόν το utf8_encode;

"Μετατρέπει μια συμβολοσειρά ISO-8859-1 σε κωδικοποίηση UTF-8"

Ναι! Ο συγγραφέας ήθελε να πει ότι η συνάρτηση μετατρέπει κείμενο από ISO-8859-1 σε UTF-8. Για αυτό είναι. Τόσο τρομερό όνομα του έδωσε μάλλον κάποιος απροσδόκητος Ευρωπαίος. Το ίδιο ισχύει και για το utf8_decode. Αυτές οι λειτουργίες δεν ισχύουν για οτιδήποτε άλλο εκτός από τη μετατροπή από ISO-8859-1 σε UTF-8. Εάν χρειάζεστε διαφορετικό ζεύγος κωδικοποίησης, χρησιμοποιήστε το iconv.
Το utf8_encode δεν είναι για εσάς μαγικό ραβδί, το οποίο πρέπει να κυματίζει πάνω από κάθε λέξη επειδή "Η PHP δεν υποστηρίζει Unicode." Αυτη καλει περισσότερα προβλήματα, μετά αποφασίζει - πείτε ευχαριστώ σε εκείνους τους Ευρωπαίους και ανίδεους προγραμματιστές.

Native-shmativny

Τι εννοούν λοιπόν όταν λένε ότι μια γλώσσα υποστηρίζει Unicode; Αυτό που έχει σημασία είναι αν η γλώσσα υποθέτει ότι ένας χαρακτήρας καταλαμβάνει ένα byte ή όχι. Έτσι, η PHP σάς επιτρέπει να έχετε πρόσβαση στον επιλεγμένο χαρακτήρα αντιμετωπίζοντας τη συμβολοσειρά ως πίνακα χαρακτήρων:

Εάν το $string έχει κωδικοποίηση ενός byte, τότε θα μας δώσει τον πρώτο χαρακτήρα. Αλλά μόνο επειδή ο "χαρακτήρας" είναι ο ίδιος με το "byte" στην κωδικοποίηση ενός byte. Η PHP δίνει απλώς το πρώτο byte χωρίς καν να σκέφτεται τους χαρακτήρες. Οι συμβολοσειρές για την PHP δεν είναι τίποτα άλλο από ακολουθίες byte, ούτε περισσότερο, ούτε λιγότερο. Αυτοί οι "αναγνώσιμοι χαρακτήρες" σας δεν είναι τίποτα άλλο από μια ανθρώπινη εφεύρεση, η PHP δεν ενδιαφέρεται γι' αυτούς.

01000100 01101111 01101110 00100111 01110100
D o n " t
01100011 01100001 01110010 01100101 00100001
Φροντίδα!

Το ίδιο ισχύει για πολλούς τυποποιημένα χαρακτηριστικά, όπως substr, strpos, trim και άλλα. Η υποστήριξη σταματά εκεί που τελειώνει η αντιστοίχιση byte-to-character:

11100110 10111100 10100010 11100101 10101101 10010111
漢 字

Το $string για την καθορισμένη συμβολοσειρά θα επιστρέψει ξανά μόνο το πρώτο byte, ίσο με 11100110. Με άλλα λόγια, το τρίτο byte του χαρακτήρα 漢. Η ακολουθία 11100110 είναι λανθασμένη για το UTF-8, επομένως η συμβολοσειρά είναι τώρα επίσης λανθασμένη. Εάν το πιστεύετε και εσείς, μπορείτε να δοκιμάσετε μια διαφορετική κωδικοποίηση, στην οποία το 11100110 θα είναι κατά κάποιο τρόπο αποδεκτό τυχαίο σύμβολο. Μπορείτε να διασκεδάσετε, απλώς όχι στον διακομιστή μάχης.

Αυτό είναι όλο. "Η PHP δεν υποστηρίζει Unicode" σημαίνει ότι οι περισσότερες συναρτήσεις στη γλώσσα υποθέτουν ότι ένα byte ισούται με έναν χαρακτήρα, με αποτέλεσμα να περικόπτονται χαρακτήρες πολλών byte ή να υπολογίζεται εσφαλμένα το μήκος συμβολοσειράς. Αυτό δεν σημαίνει ότι δεν μπορείτε να χρησιμοποιήσετε Unicode στην PHP ή ότι οποιοδήποτε κείμενο πρέπει να εκτελεστεί μέσω του utf8_encode ή κάποια άλλη ανοησία.

Ευτυχώς, υπάρχει ειδική επέκταση, το οποίο προσθέτει όλες τις σημαντικές λειτουργίες συμβολοσειράς, αλλά με υποστήριξη για κωδικοποιήσεις πολλών byte. Το mb_substr($string, 0, 1, 'UTF-8') στην παραπάνω γραμμή θα επιστρέψει σωστά την ακολουθία 11100110 10111100 10100010, που αντιστοιχεί στον χαρακτήρα 漢. Επειδή η συνάρτηση πρέπει να σκεφτεί τι κάνει, πρέπει να περάσει μια κωδικοποίηση. Επομένως, αυτές οι συναρτήσεις λαμβάνουν μια παράμετρο κωδικοποίησης $. Παρεμπιπτόντως, η κωδικοποίηση μπορεί να οριστεί καθολικά για όλες τις συναρτήσεις mb_ χρησιμοποιώντας το mb_internal_encoding.

Η χρήση και η κατάχρηση του χειρισμού σφαλμάτων PHP

Το όλο πρόβλημα με την (μη) υποστήριξη Unicode στην PHP είναι ότι ο διερμηνέας δεν ενδιαφέρεται. Ακολουθίες byte, ha. Μη σε νοιάζει τι εννοούν. Τίποτα δεν γίνεται εκτός από την αποθήκευση συμβολοσειρών στη μνήμη. Η PHP δεν έχει καν μια τέτοια έννοια - κωδικοποίηση. Και εφόσον δεν χρειάζεται να χειριστείτε χορδές, δεν πειράζει. Η εργασία γίνεται με ακολουθίες byte που μπορούν να γίνουν αντιληπτές από κάποιον ως χαρακτήρες. Η PHP απαιτεί μόνο να αποθηκεύσετε τον πηγαίο κώδικα σε κάτι συμβατό με ASCII. Ο αναλυτής PHP αναζητά συγκεκριμένους χαρακτήρες που του λένε τι να κάνει. 00100100 λέει: "δηλώνει μια μεταβλητή", 00111101 - "εκχώρηση", 00100010 - η αρχή ή το τέλος μιας γραμμής, κ.λπ. Όλα όσα δεν είναι σημαντικά για τον αναλυτή αντιμετωπίζονται ως κυριολεκτικά ακολουθίες byte. Αυτό ισχύει και για όλα όσα περικλείονται σε εισαγωγικά. Αυτό σημαίνει:

  1. Δεν θα μπορείτε να αποθηκεύσετε την πηγή PHP σε μια κωδικοποίηση που δεν είναι συμβατή με το ASCII. Για παράδειγμα, στο UTF-16, ο χαρακτήρας εισαγωγικού κωδικοποιείται ως 00000000 00100010. Για την PHP, η οποία αντιμετωπίζει τα πάντα ως ASCII, αυτό είναι ένα byte NUL ακολουθούμενο από ένα εισαγωγικό. Η PHP πιθανότατα θα έκανε λόξυγκα για κάθε χαρακτήρα και θα αποδειχτεί NUL.
  2. Μπορείτε να αποθηκεύσετε την PHP σε κωδικοποίηση συμβατή με ASCII. Εάν τα πρώτα 128 σημεία κωδικοποίησης ταιριάζουν με το ASCII, η PHP θα τα φάει. Ολα σημαντικούς χαρακτήρεςγια την PHP βρίσκονται εντός των πρώτων 128 σημείων που ορίζονται από το ASCII. Εάν τα συμβολοσειρά περιέχουν κάτι πέρα ​​από αυτό το όριο, η PHP δεν θα δώσει προσοχή. Μπορείτε να αποθηκεύσετε την πηγή σε ISO-8859-1, Mac Roman, UTF-8 ή οποιαδήποτε άλλη κωδικοποίηση. Οι χαρακτήρες συμβολοσειράς στον κώδικά σας θα λάβουν την κωδικοποίηση στην οποία αποθηκεύετε το αρχείο.
  3. Οποιος εξωτερικό αρχείογια PHP μπορεί να έχει οποιαδήποτε κωδικοποίηση. Εάν ο αναλυτής δεν χρειάζεται να επεξεργαστεί το αρχείο, τότε θα είναι ευχαριστημένος.
    $foo = file_get_contents("bar.txt");

    Τα παραπάνω απλώς θα βάλουν τα byte από το bar.txt στη μεταβλητή $foo. Η PHP δεν θα επιχειρήσει να ερμηνεύσει, να κωδικοποιήσει ή να χειραγωγήσει με άλλον τρόπο το περιεχόμενο. Το αρχείο μπορεί να περιέχει δυαδικά δεδομένα ή μια εικόνα, η PHP δεν ενδιαφέρεται.

  4. Εάν η εξωτερική και η εσωτερική κωδικοποίηση πρέπει να ταιριάζουν, τότε πραγματικά θα έπρεπε. Μια συνηθισμένη περίπτωση είναι η τοπική προσαρμογή: στον κώδικα γράφετε κάτι σαν echo localize('Foobar'), και στο εξωτερικό αρχείο είναι:
    msgstr "Foobar"
    msgstr """""

    Και οι δύο συμβολοσειρές Foobar πρέπει να έχουν την ίδια αναπαράσταση bit. Εάν ο πηγαίος κώδικας είναι σε ASCII και ο κώδικας τοπικής προσαρμογής είναι σε UTF-16, δεν έχετε τύχη. Πρέπει να γίνει πρόσθετη μετατροπή.

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

01100101 01100011 01101000 01101111 00100000 00100010
ηχώ "
11111110 11111111 00000000 01010101 00000000 01010100
(Δείκτης UTF-16) U T
00000000 01000110 00000000 00101101 00000000 00110001
F - 1
00000000 00110110 00100010 00111011
6 " ;

Η πρώτη γραμμή και τα τελευταία 2 byte είναι από το ASCII. Το υπόλοιπο αντιπροσωπεύεται σε UTF-16, 2 byte ανά χαρακτήρα. Το κορυφαίο 11111110 11111111 στη δεύτερη γραμμή είναι ένας δείκτης για την έναρξη του κειμένου στο UTF-16 (απαιτείται από το πρότυπο, η PHP δεν το έχει ακούσει ποτέ). Αυτό το σενάριο εξάγει τη συμβολοσειρά "UTF-16" που κωδικοποιείται σε UTF-16, επειδή απλώς εξάγει τα byte ανάμεσα σε δύο εισαγωγικά, το οποίο έχει ως αποτέλεσμα το κείμενο "UTF-16" που κωδικοποιείται σε UTF-16. Από την άλλη πλευρά, η πηγή δεν είναι απολύτως σωστή ούτε σε ASCII ούτε σε UTF-16, οπότε μπορείτε να ανοίξετε έναν επεξεργαστή και να διασκεδάσετε.

Σύνολο

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

Γλώσσες με υποστήριξη κωδικοποίησης

Τι σημαίνει λοιπόν για μια γλώσσα να υποστηρίζει Unicode; Το Javascript για παράδειγμα υποστηρίζει Unicode. Στην πραγματικότητα, οποιαδήποτε συμβολοσειρά στο Javascript είναι κωδικοποιημένη σε UTF-8. Και αυτή είναι η μόνη κωδικοποίηση με την οποία λειτουργεί η Javascript. Απλώς δεν μπορείτε να πάρετε μια συμβολοσειρά που δεν είναι UTF-8 σε Javascript. Η Javascript λατρεύει το Unicode σε τέτοιο βαθμό που απλά δεν υπάρχουν εργαλεία στον πυρήνα της γλώσσας για να εργαστούν με άλλες κωδικοποιήσεις. Δεδομένου ότι το Javascript εκτελείται συχνότερα στο πρόγραμμα περιήγησης, δεν έχετε κανένα πρόβλημα: το πρόγραμμα περιήγησης είναι σε θέση να εκτελέσει ασήμαντη λογική κωδικοποίησης και αποκωδικοποίησης I/O.

Άλλες γλώσσες υποστηρίζουν απλώς κωδικοποιήσεις. Η εσωτερική εργασία εκτελείται σε μία κωδικοποίηση, συχνά UTF-16. Αλλά αυτό σημαίνει ότι πρέπει να τους πούμε σε ποια κωδικοποίηση είναι το κείμενο, διαφορετικά θα προσπαθήσουν να το προσδιορίσουν οι ίδιοι. Είναι απαραίτητο να υποδείξετε σε ποια κωδικοποίηση αποθηκεύεται ο πηγαίος κώδικας, σε ποια κωδικοποίηση αποθηκεύεται το αρχείο που θα διαβαστεί και σε ποια κωδικοποίηση θα πρέπει να γίνει η έξοδος. Η γλώσσα θα πραγματοποιήσει τη μετατροπή αμέσως, εάν οριστεί ότι πρέπει να χρησιμοποιείται Unicode. Κάνουν ό,τι χρειάζεται στην PHP για να γίνει ημιαυτόματα κάπου στο παρασκήνιο. Όχι καλύτερο ή χειρότερο από την PHP, απλά διαφορετικό. Καλα ΝΕΑΤο θέμα είναι ότι οι συναρτήσεις συμβολοσειράς τελικά απλώς λειτουργούν και δεν χρειάζεται να ανησυχείτε για το αν η συμβολοσειρά περιέχει χαρακτήρες πολλών byte ή όχι, με ποιες λειτουργίες να επιλέξετε να εργαστείτε και άλλα πράγματα που θα έπρεπε να κάνετε στην PHP.

Wilds Unicode

Αφού το Unicode λύνει τόσα πολλά διάφορα προβλήματακαι λειτουργεί σε πολλά διαφορετικά σενάρια, πρέπει να πληρώσετε για αυτό σκάβοντας στην άγρια ​​φύση. Για παράδειγμα, το πρότυπο Unicode περιέχει πληροφορίες για την επίλυση προβλημάτων όπως η ενοποίηση των ιερογλυφικών YAKK. Πολλά σύμβολα κοινά στην Ιαπωνία, την Κίνα και την Κορέα απεικονίζονται ελαφρώς διαφορετικά. Ή το πρόβλημα της μετατροπής χαρακτήρων από πεζά σε κεφαλαία, αντίστροφα ή μπρος-πίσω, που δεν είναι πάντα τόσο απλό όσο με τις κωδικοποιήσεις των δυτικοευρωπαϊκών γλωσσών. Ορισμένα σύμβολα μπορεί να αντιπροσωπεύονται από διαφορετικά στοιχεία. Το γράμμα ö, για παράδειγμα, μπορεί να αντιπροσωπεύεται από το στοιχείο U+00F6 («ΛΑΤΙΝΙΚΟ ΜΙΚΡΟ ΓΡΑΜΜΑ O ΜΕ ΔΙΑΡΕΣΗ») ή ως δύο στοιχεία U+006F («ΜΙΚΡΟ ΓΡΑΜΜΑ Ο») ΚΑΙ U+0308 («ΑΝΤΙΚΑΤΑΣΤΑΣΗ ΔΙΑΡΕΣΗΣ») , που σημαίνει το γράμμα ο Με. Στο UTF-8 είναι είτε 2 byte είτε 3 byte, που και στις δύο περιπτώσεις αντιπροσωπεύει έναν κανονικό χαρακτήρα. Επομένως, υπάρχουν κανόνες κανονικοποίησης στο πρότυπο, π.χ. πώς να μετατρέψετε αυτές τις φόρμες από το ένα στο άλλο. Αυτό και πολλά άλλα είναι πέρα ​​από το πεδίο αυτού του άρθρου, αλλά πρέπει να γνωρίζετε για αυτά τα σημεία.

Δεν το ξαναπίεσα!
  1. Το κείμενο είναι πάντα μια ακολουθία bits που πρέπει να μεταφραστεί σε φυσική γλώσσα χρησιμοποιώντας πίνακες. Μη έγκυρος πίνακας - μη έγκυρο σύμβολο.
  2. Δεν μπορείτε να εργαστείτε απευθείας με κείμενο - εργάζεστε πάντα με bits που είναι τυλιγμένα σε αφαιρέσεις. Τα λάθη οφείλονται σε σφάλματα σε μία από τις αφαιρέσεις.
  3. Τα συστήματα που μεταδίδουν πληροφορίες μεταξύ τους πρέπει πάντα να υποδεικνύουν την κωδικοποίηση λειτουργίας. Για παράδειγμα, ο ιστότοπος λέει στο πρόγραμμα περιήγησης ότι παρέχει πληροφορίες σε UTF-8.
  4. Σήμερα, το UTF-8 είναι συμβατό με ASCII, παρά το γεγονός ότι μπορεί να κωδικοποιήσει σχεδόν κάθε χαρακτήρα και εξακολουθεί να είναι σχετικά αποτελεσματικό στις περισσότερες περιπτώσεις. Άλλες κωδικοποιήσεις έχουν επίσης τις χρήσεις τους, αλλά πρέπει να υπάρχει ένας καλός λόγος να ασχοληθείτε με κωδικοποιήσεις που υποστηρίζουν μόνο μέρος του Unicode.
  5. Τόσο το πρόγραμμα όσο και ο προγραμματιστής πρέπει να αντιμετωπίσουν το πρόβλημα της αντιστοίχισης ενός byte και ενός χαρακτήρα.

Τώρα δεν χρειάζεται να δικαιολογείτε όταν ανακατεύετε ξανά το κείμενο.

Ετικέτες: Προσθήκη ετικετών

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

Ωστόσο, ακόμη και 1 byte σας επιτρέπει να κωδικοποιήσετε 2 φορές περισσότερες τιμές, δηλαδή όχι 128, αλλά έως και 256 διαφορετικές τιμές. Επομένως, αρκετά γρήγορα για να αντικαταστήσετε το βασικό ASCIIΆρχισαν να εμφανίζονται πιο διευρυμένες εκδόσεις αυτής της διάσημης και δημοφιλής κωδικοποίησης, στις οποίες κωδικοποιήθηκαν επίσης χαρακτήρες αλφαβήτων και, κατά συνέπεια, κείμενο διαφόρων γλωσσών, συμπεριλαμβανομένων των ρωσικών.

Επεκτάσεις ASCII για τη Ρωσία

Σήμερα, η κωδικοποίηση αποτελεί προτεραιότητα για τους Ρώσους χρήστες Windows 1251και κωδικοποίηση Unicode, επίσης UTF 8που προήλθε από ASCII.

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

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

Κωδικοποίηση CP866 και KOI8-Rχρησιμοποιήθηκαν ευρέως πριν από την εμφάνιση του γραφικού λειτουργικού συστήματος, το οποίο κέρδισε δημοτικότητα σε όλο τον κόσμο - Windows. Τώρα η πιο δημοφιλής κωδικοποίηση που υποστηρίζει τα ρωσικά είναι Windows 1251.

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

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

Καθολικές κωδικοποιήσεις

Η πρώτη έκδοση της καθολικής κωδικοποίησης που αναπτύχθηκε στο πλαίσιο της κοινοπραξίας Unicode ήταν η κωδικοποίηση UTF 32. Χρησιμοποιήθηκαν 32 bit για την κωδικοποίηση κάθε χαρακτήρα. Τώρα έγινε πραγματικότητα η δυνατότητα κωδικοποίησης ενός τεράστιου αριθμού χαρακτήρων, αλλά εμφανίστηκε ένα άλλο πρόβλημα - οι περισσότερες ευρωπαϊκές χώρες δεν χρειάζονταν τέτοιο αριθμό επιπλέον χαρακτήρων. Άλλωστε τα έγγραφα αποδείχτηκαν πολύ βαριά. Επομένως, για αντικατάσταση UTF 32ήρθε UTF 16, που έχει γίνει η βάση για όλα τα σύμβολα που χρησιμοποιούνται στη χώρα μας και όχι μόνο.

Αλλά υπήρχαν ακόμα πολλοί δυσαρεστημένοι. Για παράδειγμα, όσοι επικοινωνούσαν μόνο σε αγγλική γλώσσα, από τότε που μετακόμισε από ASCII σε UTF 16 Τα έγγραφά τους εξακολουθούν να αυξάνονται σε μέγεθος, και σημαντικά, σχεδόν 2 φορές.
Το αποτέλεσμα ήταν κωδικοποίηση μεταβλητού μήκους UTF 8, που επέτρεψε να μην αυξηθεί το βάρος του κειμένου.

Krakozyabry και μέθοδοι αντιμετώπισής τους

Γενικά, η κωδικοποίηση ορίζεται στη σελίδα όπου το Ανακοίνωση. Ως αποτέλεσμα, σχηματίζεται ένα είδος σημάδι στην αρχή του εγγράφου, στο οποίο θυμάται εάν οι κωδικοί χαρακτήρων είναι γραμμένοι με άμεση ή αντίστροφη σειρά. UTF16.

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

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

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

Για παράδειγμα, όπως αυτό

Γεια σας, αγαπητοί αναγνώστες του ιστότοπου του ιστολογίου. Σήμερα θα σας μιλήσουμε για το από πού προέρχονται τα krakozyabr σε έναν ιστότοπο και σε προγράμματα, ποιες κωδικοποιήσεις κειμένου υπάρχουν και ποιες πρέπει να χρησιμοποιηθούν. Ας ρίξουμε μια πιο προσεκτική ματιά στην ιστορία της ανάπτυξής τους, ξεκινώντας από το βασικό ASCII, καθώς και τις εκτεταμένες εκδόσεις του CP866, KOI8-R, Windows 1251 και τελειώνοντας με τις σύγχρονες κωδικοποιήσεις Unicode Consortium UTF 16 και 8.

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

ASCII - βασική κωδικοποίηση κειμένου για το λατινικό αλφάβητο

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

Αλλά ακόμα Αφετηρίαγια την ανάπτυξη σύγχρονες κωδικοποιήσειςτα κείμενα πρέπει να θεωρούνται διάσημα ASCII(American Standard Κωδικός για Ανταλλαγή Πληροφοριών, που στα ρωσικά προφέρεται συνήθως ως "aski"). Περιγράφει τους πρώτους 128 χαρακτήρες που χρησιμοποιούνται πιο συχνά από αγγλόφωνους χρήστες - γράμματα, αραβικούς αριθμούς και σημεία στίξης.

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

Είναι αυτοί οι 128 χαρακτήρες από την αρχική έκδοση του ASCII που έχουν γίνει το πρότυπο και σε οποιαδήποτε άλλη κωδικοποίηση θα τους βρείτε σίγουρα και θα εμφανίζονται με αυτή τη σειρά.

Αλλά το γεγονός είναι ότι με ένα byte πληροφοριών μπορείτε να κωδικοποιήσετε όχι 128, αλλά έως και 256 διαφορετικές έννοιες(δύο στη δύναμη του οκτώ ισούται με 256), οπότε ακολουθεί βασική έκδοσηΕμφανίστηκε μια ολόκληρη σειρά από Asukas εκτεταμένες κωδικοποιήσεις ASCII, στο οποίο, εκτός από 128 βασικούς χαρακτήρες, ήταν επίσης δυνατή η κωδικοποίηση συμβόλων της εθνικής κωδικοποίησης (για παράδειγμα, ρωσικά).

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

Δεν είναι δύσκολο να καταλάβουμε ότι όλοι πιθανούς συνδυασμούςΣε μια τέτοια κατασκευή μπορούν να υπάρχουν μόνο 256 μηδενικά και ένα δυαδικό σύστημαστο δεκαδικό είναι αρκετά απλό. Απλά πρέπει να αθροίσετε όλες τις δυνάμεις των δύο με μία πάνω από αυτές.

Στο παράδειγμά μας, αυτό αποδεικνύεται ότι είναι 1 (2 στη δύναμη του μηδέν) συν 8 (δύο στη δύναμη του 3), συν 32 (δύο στην πέμπτη δύναμη), συν 64 (στην έκτη δύναμη), συν 128 (στην έβδομη δύναμη). Το σύνολο παίρνει 233 in μετρικό σύστημαΥπολογισμός Όπως μπορείτε να δείτε, όλα είναι πολύ απλά.

Αλλά αν κοιτάξετε προσεκτικά τον πίνακα με χαρακτήρες ASCII, θα δείτε ότι αντιπροσωπεύονται σε δεκαεξαδική κωδικοποίηση. Για παράδειγμα, ο "αστερίσκος" αντιστοιχεί στον δεκαεξαδικό αριθμό 2Α στο Aski. Πιθανότατα γνωρίζετε ότι στο δεκαεξαδικό σύστημα αριθμών, εκτός από τους αραβικούς αριθμούς, χρησιμοποιούνται και λατινικά γράμματα από το A (σημαίνει δέκα) έως το F (σημαίνει δεκαπέντε).

Λοιπόν, για μετάφραση δυάδικος αριθμόςσε δεκαεξαδικόκαταφύγετε στην παρακάτω απλή και προφανή μέθοδο. Κάθε byte πληροφοριών χωρίζεται σε δύο μέρη των τεσσάρων bit, όπως φαίνεται στο παραπάνω στιγμιότυπο οθόνης. Οτι. σε κάθε μισό byte δυάδικος κώδικαςμόνο δεκαέξι τιμές μπορούν να κωδικοποιηθούν (δύο έως την τέταρτη ισχύ), οι οποίες μπορούν εύκολα να αναπαρασταθούν ως δεκαεξαδικός αριθμός.

Επιπλέον, στο αριστερό μισό του byte οι μοίρες θα πρέπει να μετρηθούν ξανά ξεκινώντας από το μηδέν και όχι όπως φαίνεται στο στιγμιότυπο οθόνης. Ως αποτέλεσμα, μέσω απλών υπολογισμών, παίρνουμε ότι ο αριθμός Ε9 είναι κωδικοποιημένος στο στιγμιότυπο οθόνης. Ελπίζω ότι η πορεία του συλλογισμού μου και η λύση αυτού του γρίφου ήταν σαφής για εσάς. Λοιπόν, τώρα ας συνεχίσουμε, στην πραγματικότητα, μιλώντας για κωδικοποιήσεις κειμένου.

Εκτεταμένες εκδόσεις κωδικοποιήσεων Asuka - CP866 και KOI8-R με ψευδογραφήματα

Έτσι, αρχίσαμε να μιλάμε για το ASCII, το οποίο ήταν, σαν να λέγαμε, το σημείο εκκίνησης για την ανάπτυξη όλων των σύγχρονων κωδικοποιήσεων (Windows 1251, Unicode, UTF 8).

Αρχικά, περιείχε μόνο 128 χαρακτήρες του λατινικού αλφαβήτου, αραβικούς αριθμούς και κάτι άλλο, αλλά στην εκτεταμένη έκδοση κατέστη δυνατή η χρήση και των 256 τιμών που μπορούν να κωδικοποιηθούν σε ένα byte πληροφοριών. Εκείνοι. Κατέστη δυνατή η προσθήκη συμβόλων γραμμάτων της γλώσσας σας στο Aski.

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

Είναι σαφές ότι οι ίδιες οι γραμματοσειρές είναι υπεύθυνες για τα διανυσματικά σχήματα, αλλά το λειτουργικό σύστημα και τα προγράμματα που χρησιμοποιούνται σε αυτό είναι υπεύθυνα για την κωδικοποίηση. Εκείνοι. οποιοδήποτε κείμενο στον υπολογιστή σας θα είναι ένα σύνολο byte, καθένα από τα οποία κωδικοποιεί έναν μόνο χαρακτήρα αυτού του κειμένου.

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

Αυτό σημαίνει ότι για να κωδικοποιήσουμε οποιονδήποτε χαρακτήρα χρειαζόμαστε (για παράδειγμα, από το εθνικό αλφάβητο), πρέπει να πληρούνται δύο προϋποθέσεις - η διανυσματική μορφή αυτού του χαρακτήρα πρέπει να είναι στη γραμματοσειρά που χρησιμοποιείται και αυτός ο χαρακτήρας θα μπορούσε να κωδικοποιηθεί σε εκτεταμένες κωδικοποιήσεις ASCII στο ένα byte. Επομένως, υπάρχει μια ολόκληρη δέσμη τέτοιων επιλογών. Μόνο για την κωδικοποίηση χαρακτήρων της ρωσικής γλώσσας, υπάρχουν πολλές ποικιλίες εκτεταμένων Aska.

Για παράδειγμα, εμφανίστηκε αρχικά CP866, που είχε τη δυνατότητα να χρησιμοποιεί χαρακτήρες από το ρωσικό αλφάβητο και ήταν μια εκτεταμένη έκδοση του ASCII.

Εκείνοι. Το πάνω μέρος του συνέπεσε πλήρως με τη βασική έκδοση του Asuka (128 λατινικοί χαρακτήρες, αριθμοί και άλλα χάλια), η οποία παρουσιάζεται στο στιγμιότυπο οθόνης ακριβώς από πάνω, αλλά τώρα Κάτω μέροςΟι πίνακες με κωδικοποίηση CP866 είχαν τη μορφή που φαίνεται στο στιγμιότυπο οθόνης ακριβώς παρακάτω και σας επέτρεπαν να κωδικοποιήσετε άλλους 128 χαρακτήρες (ρωσικά γράμματα και κάθε είδους ψευδογραφικά):

Βλέπετε, στη δεξιά στήλη οι αριθμοί ξεκινούν με 8, γιατί... Οι αριθμοί από το 0 έως το 7 αναφέρονται στο βασικό μέρος του ASCII (δείτε το πρώτο στιγμιότυπο οθόνης). Οτι. το ρωσικό γράμμα "M" στο CP866 θα έχει τον κωδικό 9С (βρίσκεται στη διασταύρωση αντίστοιχες γραμμέςαπό το 9 και μια στήλη με τον αριθμό C στο δεκαεξαδικό σύστημα αριθμών), η οποία μπορεί να γραφτεί σε ένα byte πληροφοριών και εάν έχετε κατάλληλη γραμματοσειρά με ρωσικούς χαρακτήρες, αυτό το γράμμα θα εμφανίζεται στο κείμενο χωρίς κανένα πρόβλημα.

Από πού προήλθε αυτό το ποσό; ψευδογραφικά στο CP866? Το όλο θέμα είναι ότι αυτή η κωδικοποίηση για το ρωσικό κείμενο αναπτύχθηκε εκείνα τα δύσκολα χρόνια όταν τα λειτουργικά συστήματα γραφικών δεν ήταν τόσο διαδεδομένα όσο τώρα. Και στο Dosa και σε παρόμοια λειτουργικά συστήματα κειμένου, τα ψευδογραφικά στοιχεία κατέστησαν δυνατή τουλάχιστον με κάποιο τρόπο τη διαφοροποίηση του σχεδιασμού των κειμένων, και επομένως το CP866 και όλα τα άλλα όμοιά του από την κατηγορία των εκτεταμένων εκδόσεων του Asuka αφθονούν σε αυτό.

Το CP866 διανεμήθηκε από την IBM, αλλά εκτός από αυτό, αναπτύχθηκε ένας αριθμός κωδικοποιήσεων για χαρακτήρες ρωσικής γλώσσας, για παράδειγμα, μπορεί να αποδοθεί ο ίδιος τύπος (εκτεταμένο ASCII) ΚΟΙ8-Ρ:

Η αρχή της λειτουργίας του παραμένει η ίδια με αυτή του CP866 που περιγράφηκε λίγο νωρίτερα - κάθε χαρακτήρας κειμένου κωδικοποιείται από ένα μόνο byte. Το στιγμιότυπο οθόνης δείχνει το δεύτερο μισό του πίνακα KOI8-R, επειδή το πρώτο ημίχρονο είναι απολύτως συνεπές με το βασικό Asuka, το οποίο φαίνεται στο πρώτο στιγμιότυπο οθόνης αυτού του άρθρου.

Μεταξύ των χαρακτηριστικών της κωδικοποίησης KOI8-R, μπορεί να σημειωθεί ότι τα ρωσικά γράμματα στον πίνακά του δεν μπαίνουν αλφαβητική σειρά, όπως, για παράδειγμα, έκαναν στο CP866.

Αν κοιτάξετε το πρώτο στιγμιότυπο οθόνης (του βασικού μέρους, το οποίο περιλαμβάνεται σε όλες τις εκτεταμένες κωδικοποιήσεις), θα παρατηρήσετε ότι στο KOI8-R τα ρωσικά γράμματα βρίσκονται στα ίδια κελιά του πίνακα με τα αντίστοιχα γράμματα του λατινικού αλφαβήτου από το πρώτο μέρος του πίνακα. Αυτό έγινε για τη διευκόλυνση της εναλλαγής από τους ρωσικούς σε λατινικούς χαρακτήρες, απορρίπτοντας μόνο ένα bit (δύο στην έβδομη δύναμη ή 128).

Windows 1251 - η σύγχρονη έκδοση του ASCII και γιατί βγαίνουν οι ρωγμές

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

Ανήκαν στις λεγόμενες κωδικοποιήσεις ANSI, οι οποίες αναπτύχθηκαν από το Αμερικανικό Ινστιτούτο Προτύπων. Στην κοινή γλώσσα, το όνομα Κυριλλικό χρησιμοποιήθηκε επίσης για την έκδοση με υποστήριξη ρωσικής γλώσσας. Ένα παράδειγμα αυτού θα ήταν.

Διέφερε ευνοϊκά από τα προηγούμενα χρησιμοποιημένα CP866 και KOI8-R στο ότι τη θέση των ψευδογραφικών συμβόλων σε αυτό πήραν τα σύμβολα της ρωσικής τυπογραφίας που λείπουν (εκτός από το σημάδι τονισμού), καθώς και τα σύμβολα που χρησιμοποιούνται σε σλαβικές γλώσσες κοντά στο Ρωσικά (Ουκρανικά, Λευκορωσικά, κ.λπ.):

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

Πολύ συχνά εμφανίζονταν κατά την αποστολή και λήψη μηνυμάτων μέσω ΗΛΕΚΤΡΟΝΙΚΗ ΔΙΕΥΘΥΝΣΗ, το οποίο συνεπαγόταν τη δημιουργία πολύ περίπλοκων πινάκων μετατροπής, οι οποίοι, στην πραγματικότητα, ουσιαστικά δεν μπορούσαν να λύσουν αυτό το πρόβλημα, και οι χρήστες συχνά χρησιμοποιούσαν για αλληλογραφία για να αποφύγουν τα περιβόητα τεχνάσματα όταν χρησιμοποιούν ρωσικές κωδικοποιήσεις όπως CP866, KOI8-R ή Windows 1251.

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

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

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

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

Unicode - καθολικές κωδικοποιήσεις UTF 8, 16 και 32

Αυτοί οι χιλιάδες χαρακτήρες της ομάδας γλωσσών της Νοτιοανατολικής Ασίας δεν μπορούσαν να περιγραφούν σε ένα byte πληροφοριών που διατέθηκε για την κωδικοποίηση χαρακτήρων σε εκτεταμένες εκδόσεις του ASCII. Ως αποτέλεσμα, δημιουργήθηκε μια κοινοπραξία που ονομάζεται Unicode(Unicode - Unicode Consortium) με τη συνεργασία πολλών ηγετών του κλάδου της πληροφορικής (εκείνων που παράγουν λογισμικό, που κωδικοποιούν υλικό, που δημιουργούν γραμματοσειρές), που ενδιαφέρθηκαν για την εμφάνιση μιας καθολικής κωδικοποίησης κειμένου.

Η πρώτη παραλλαγή που κυκλοφόρησε υπό την αιγίδα της Unicode Consortium ήταν UTF 32. Ο αριθμός στο όνομα κωδικοποίησης σημαίνει τον αριθμό των bit που χρησιμοποιούνται για την κωδικοποίηση ενός χαρακτήρα. 32 bit ισούται με 4 byte πληροφοριών που θα χρειαστούν για την κωδικοποίηση ενός μεμονωμένου χαρακτήρα στη νέα καθολική κωδικοποίηση UTF.

Ως αποτέλεσμα, το ίδιο αρχείο με κείμενο κωδικοποιημένο στην εκτεταμένη έκδοση του ASCII και σε UTF-32, στην τελευταία περίπτωση, θα έχει μέγεθος (βάρος) τέσσερις φορές μεγαλύτερο. Αυτό είναι κακό, αλλά τώρα έχουμε την ευκαιρία να κωδικοποιήσουμε χρησιμοποιώντας YTF έναν αριθμό χαρακτήρων ίσο με δύο στη δύναμη τριάντα δευτερολέπτων ( δισεκατομμύρια χαρακτήρες, που θα καλύψει κάθε πραγματικά απαραίτητη αξία με ένα κολοσσιαίο περιθώριο).

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

Ως αποτέλεσμα της ανάπτυξης του Unicode, UTF-16, το οποίο αποδείχθηκε τόσο επιτυχημένο που υιοθετήθηκε από προεπιλογή ως ο βασικός χώρος για όλους τους χαρακτήρες που χρησιμοποιούμε. Χρησιμοποιεί δύο byte για την κωδικοποίηση ενός χαρακτήρα. Ας δούμε πώς φαίνεται αυτό το πράγμα.

Στο λειτουργικό σύστημα Windows, μπορείτε να ακολουθήσετε τη διαδρομή "Έναρξη" - "Προγράμματα" - "Αξεσουάρ" - "Εργαλεία συστήματος" - "Πίνακας χαρακτήρων". Ως αποτέλεσμα, θα ανοίξει ένας πίνακας με διανυσματικές μορφέςόλες οι γραμματοσειρές που είναι εγκατεστημένες στο σύστημά σας. Εάν επιλέξετε το σύνολο χαρακτήρων Unicode στις «Επιλογές για προχωρημένους», θα μπορείτε να δείτε για κάθε γραμματοσειρά ξεχωριστά ολόκληρο το φάσμα των χαρακτήρων που περιλαμβάνονται σε αυτήν.

Παρεμπιπτόντως, κάνοντας κλικ σε οποιοδήποτε από αυτά, μπορείτε να δείτε τα δύο byte του κώδικα σε μορφή UTF-16, που αποτελείται από τέσσερα δεκαεξαδικά ψηφία:

Πόσοι χαρακτήρες μπορούν να κωδικοποιηθούν στο UTF-16 χρησιμοποιώντας 16 bit; 65.536 (δύο στη δύναμη του δεκαέξι) και αυτός είναι ο αριθμός που υιοθετήθηκε ως ο βασικός χώρος στο Unicode. Επιπλέον, υπάρχουν τρόποι κωδικοποίησης περίπου δύο εκατομμυρίων χαρακτήρων χρησιμοποιώντας το, αλλά περιορίζονταν σε έναν εκτεταμένο χώρο ενός εκατομμυρίου χαρακτήρων κειμένου.

Αλλά ακόμη και αυτή η επιτυχημένη έκδοση της κωδικοποίησης Unicode δεν έφερε μεγάλη ικανοποίηση σε όσους έγραψαν, ας πούμε, προγράμματα μόνο στα αγγλικά, γιατί γι' αυτούς, μετά τη μετάβαση από την εκτεταμένη έκδοση του ASCII στο UTF-16, το βάρος των εγγράφων διπλασιάστηκε ( ένα byte ανά χαρακτήρα στο Aski και δύο byte για τον ίδιο χαρακτήρα στο YUTF-16).

Ήταν ακριβώς για να ικανοποιήσει τους πάντες και τα πάντα στην κοινοπραξία Unicode που αποφασίστηκε να καταλήξει κωδικοποίηση μεταβλητού μήκους. Ονομάστηκε UTF-8. Παρά το οκτώ στο όνομά του, στην πραγματικότητα έχει μεταβλητό μήκος, δηλ. Κάθε χαρακτήρας κειμένου μπορεί να κωδικοποιηθεί σε μια ακολουθία μήκους ενός έως έξι byte.

Στην πράξη, το UTF-8 χρησιμοποιεί μόνο το εύρος από ένα έως τέσσερα byte, γιατί πέρα ​​από τέσσερα byte κώδικα δεν είναι πλέον ούτε θεωρητικά δυνατό να φανταστεί κανείς οτιδήποτε. Όλοι οι λατινικοί χαρακτήρες σε αυτό κωδικοποιούνται σε ένα byte, όπως στο παλιό καλό ASCII.

Αυτό που είναι αξιοσημείωτο είναι ότι στην περίπτωση κωδικοποίησης μόνο του λατινικού αλφαβήτου, ακόμη και εκείνα τα προγράμματα που δεν καταλαβαίνουν Unicode θα εξακολουθούν να διαβάζουν ό,τι είναι κωδικοποιημένο στο YTF-8. Εκείνοι. το βασικό μέρος της Asuka απλώς μεταφέρθηκε σε αυτή τη δημιουργία της κοινοπραξίας Unicode.

Οι κυριλλικοί χαρακτήρες στο UTF-8 κωδικοποιούνται σε δύο byte και, για παράδειγμα, οι γεωργιανοί χαρακτήρες κωδικοποιούνται σε τρία byte. Η κοινοπραξία Unicode, αφού δημιούργησε τα UTF 16 και 8, έλυσε το κύριο πρόβλημα - τώρα έχουμε Οι γραμματοσειρές έχουν έναν ενιαίο χώρο κώδικα. Και τώρα οι κατασκευαστές τους μπορούν να το γεμίσουν μόνο με διανυσματικές μορφές χαρακτήρων κειμένου με βάση τα δυνατά τους σημεία και τις δυνατότητές τους. Τώρα έρχονται και σε σετ.

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

Τρελές λέξεις αντί για ρωσικά γράμματα - πώς να το διορθώσετε

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

Για επεξεργασία και δημιουργία αρχεία κειμένουΠροσωπικά χρησιμοποιώ ένα πολύ καλό, κατά τη γνώμη μου, . Ωστόσο, μπορεί επίσης να επισημάνει τη σύνταξη μια καλή εκατόγλώσσες προγραμματισμού και σήμανσης, και έχει επίσης τη δυνατότητα επέκτασης χρησιμοποιώντας πρόσθετα. Ανάγνωση λεπτομερής ανασκόπησηαυτό το υπέροχο πρόγραμμα στον σύνδεσμο που παρέχεται.

Στο επάνω μενού του Notepad++ υπάρχει ένα στοιχείο "Κωδικοποιήσεις", όπου θα έχετε την ευκαιρία να μετατρέψετε μια υπάρχουσα επιλογή σε αυτήν που χρησιμοποιείται από προεπιλογή στον ιστότοπό σας:

Στην περίπτωση ενός ιστότοπου σε Joomla 1.5 και νεότερης έκδοσης, καθώς και στην περίπτωση ενός ιστολογίου στο WordPress, θα πρέπει να επιλέξετε την επιλογή να αποφύγετε την εμφάνιση ρωγμών UTF 8 χωρίς BOM. Τι είναι το πρόθεμα BOM;

Το γεγονός είναι ότι όταν ανέπτυξαν την κωδικοποίηση YUTF-16, για κάποιο λόγο αποφάσισαν να επισυνάψουν σε αυτήν κάτι όπως η δυνατότητα εγγραφής του κώδικα χαρακτήρων τόσο με άμεση σειρά (για παράδειγμα, 0A15) όσο και αντίστροφα (150A) . Και για να καταλάβουν τα προγράμματα ακριβώς με ποια σειρά να διαβάσουν τους κωδικούς, εφευρέθηκε BOM(Byte Order Mark ή, με άλλα λόγια, υπογραφή), που εκφράστηκε με την προσθήκη τριών επιπλέον byte στην αρχή των εγγράφων.

Στην κωδικοποίηση UTF-8, δεν προβλέπονταν BOM στην κοινοπραξία Unicode, και επομένως η προσθήκη μιας υπογραφής (αυτά τα περιβόητα επιπλέον τρία byte στην αρχή του εγγράφου) απλώς εμποδίζει ορισμένα προγράμματα να διαβάσουν τον κώδικα. Επομένως, κατά την αποθήκευση αρχείων σε UTF, πρέπει πάντα να επιλέγουμε την επιλογή χωρίς BOM (χωρίς υπογραφή). Άρα είσαι εκ των προτέρων προστατεύστε τον εαυτό σας από το να σέρνετε krakozyabrs.

Αυτό που είναι αξιοσημείωτο είναι ότι ορισμένα προγράμματα στα Windows δεν μπορούν να το κάνουν αυτό (δεν μπορούν να αποθηκεύσουν κείμενο στο UTF-8 χωρίς BOM), για παράδειγμα, το ίδιο περιβόητο Σημειωματάριο των Windows. Αποθηκεύει το έγγραφο σε UTF-8, αλλά εξακολουθεί να προσθέτει την υπογραφή (τρία επιπλέον byte) στην αρχή του. Επιπλέον, αυτά τα byte θα είναι πάντα τα ίδια - διαβάστε τον κώδικα με άμεση σειρά. Αλλά στους διακομιστές, λόγω αυτού του μικρού πράγματος, μπορεί να προκύψει ένα πρόβλημα - θα βγουν απατεώνες.

Επομένως, σε καμία περίπτωση μη χρησιμοποιείτε με ένα κανονικό σημειωματάριο Windowsγια να επεξεργαστείτε έγγραφα στον ιστότοπό σας εάν δεν θέλετε να εμφανιστούν ρωγμές. Θεωρώ ότι το ήδη αναφερθέν πρόγραμμα επεξεργασίας Notepad++ είναι η καλύτερη και απλούστερη επιλογή, η οποία πρακτικά δεν έχει μειονεκτήματα και αποτελείται μόνο από πλεονεκτήματα.

Στο Notepad++, όταν επιλέγετε μια κωδικοποίηση, θα έχετε την επιλογή να μετατρέψετε κείμενο σε κωδικοποίηση UCS-2, η οποία είναι πολύ κοντά στη φύση του με το πρότυπο Unicode. Επίσης στο Σημειωματάριο θα είναι δυνατή η κωδικοποίηση κειμένου σε ANSI, δηλ. σε σχέση με τη ρωσική γλώσσα, αυτό θα είναι το Windows 1251, το οποίο ήδη περιγράψαμε από πού προέρχονται αυτές οι πληροφορίες;

Είναι καταχωρημένο στο μητρώο του χειρουργείου σας συστήματα Windows- ποια κωδικοποίηση να επιλέξετε στην περίπτωση ANSI, ποια να επιλέξετε στην περίπτωση OEM (για τη ρωσική γλώσσα θα είναι CP866). Εάν ορίσετε άλλη προεπιλεγμένη γλώσσα στον υπολογιστή σας, τότε αυτές οι κωδικοποιήσεις θα αντικατασταθούν με παρόμοιες από την κατηγορία ANSI ή OEM για την ίδια γλώσσα.

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

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

Γενικά, όλες οι γλώσσες σήμανσης υπερκειμένου εκτός από το Html χρησιμοποιούν μια ειδική δήλωση xml, η οποία καθορίζει την κωδικοποίηση κειμένου.

Πριν αναλύσει τον κώδικα, το πρόγραμμα περιήγησης γνωρίζει ποια έκδοση χρησιμοποιείται και πώς ακριβώς χρειάζεται να ερμηνεύσει τους κωδικούς χαρακτήρων αυτής της γλώσσας. Αλλά αυτό που είναι αξιοσημείωτο είναι ότι εάν αποθηκεύσετε το έγγραφο στο προεπιλεγμένο Unicode, τότε αυτή η δήλωση xml μπορεί να παραλειφθεί (η κωδικοποίηση θα θεωρείται UTF-8 εάν δεν υπάρχει BOM ή UTF-16 εάν υπάρχει BOM).

Στην περίπτωση εγγράφου Γλώσσα HTMLχρησιμοποιείται για την ένδειξη κωδικοποίησης Μεταστοιχείο, το οποίο είναι γραμμένο μεταξύ των ετικετών Head ανοίγματος και κλεισίματος:

... ...

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

Θεωρητικά, ένα στοιχείο Meta με ένδειξη Κωδικοποιήσεις HTMLθα ήταν καλύτερα να βάλεις το έγγραφο όσο πιο ψηλά γίνεται στην κεφαλίδα του εγγράφουέτσι ώστε τη στιγμή που θα συναντήσετε τον πρώτο χαρακτήρα στο κείμενο που δεν είναι από το βασικό ANSI (που διαβάζονται πάντα σωστά και σε οποιαδήποτε παραλλαγή), το πρόγραμμα περιήγησης θα πρέπει να έχει ήδη πληροφορίες σχετικά με τον τρόπο ερμηνείας των κωδικών αυτών των χαρακτήρων.

Καλή σου τύχη! Πριν τα λέμε σύντομαστις σελίδες του ιστότοπου του ιστολογίου

Μπορείτε να παρακολουθήσετε περισσότερα βίντεο μεταβαίνοντας στο
");">

Μπορεί να σας ενδιαφέρει

Τι συνέβη Διευθύνσεις URLΠοια είναι η διαφορά μεταξύ απόλυτων και σχετικών συνδέσμων για έναν ιστότοπο;
OpenServer - σύγχρονος τοπικός διακομιστήςκαι ένα παράδειγμα χρήσης του για Εγκαταστάσεις WordPressστον υπολογιστή
Τι είναι το Chmod, ποια δικαιώματα να εκχωρήσετε σε αρχεία και φακέλους (777, 755, 666) και πώς να το κάνετε μέσω PHP
Αναζήτηση Yandex ανά ιστότοπο και ηλεκτρονικό κατάστημα

Καλημέρα σε όλους. Ο Alexey Gulynin είναι σε επαφή. Στο τελευταίο άρθρο που εξετάσαμε δημιουργία πινάκων σε html. Σε αυτό το άρθρο θα ήθελα να μιλήσω για ένα πρόβλημα που σίγουρα θα συναντήσετε (αν δεν το έχετε ήδη αντιμετωπίσει) στο ιατρείο σας. Και αυτό το πρόβλημα σχετίζεται με κωδικοποίηση στον ιστότοπο. Αυτή η κατάσταση συμβαίνει συχνά: κάθεσαι, σκέφτεσαι κάτι και στο τέλος οι σκέψεις σου εκφράζονται σε γραπτό κώδικα. Ανοίγετε τη δημιουργία σας στο πρόγραμμα περιήγησης και υπάρχει πλήρης ανοησία γραμμένη εκεί, ή όπως συνήθως αποκαλούν αυτή την ανοησία - "krakozyabry". Ένα πράγμα είναι προφανές εδώ, αυτό πρόβλημα με την κωδικοποίηση στον ιστότοπο. Το πιθανότερο είναι ότι η προεπιλεγμένη κωδικοποίηση είναι windows-1251 (Κυριλλικό), και το πρόγραμμα περιήγησης προσπαθεί να ανοίξει το αρχείο σας σε κωδικοποίηση utf-8. Εν συντομία για το τι είναι η κωδικοποίηση. Η κωδικοποίηση είναι ένα είδος πίνακα που εκχωρεί σε κάθε χαρακτήρα έναν συγκεκριμένο χαρακτήρα κωδικός μηχανής. Κατά συνέπεια, τα ρωσικά μας γράμματα σε μια κωδικοποίηση έχουν έναν κωδικό, σε άλλα - διαφορετικό κωδικό. Φίλοι, χρησιμοποιήστε κωδικοποίηση utf-8 παντού και θα είστε ευχαριστημένοι. Το Utf-8 ονομάζεται επίσης Unicode.

Ας δημιουργήσουμε ένα δοκιμαστικό έγγραφο στο Notepad++ και ας γράψουμε τον παρακάτω κώδικα.

Προβλήματα κωδικοποίησης

Δοκιμή προβλημάτων κωδικοποίησης



Στο μενού Notepad++, βεβαιωθείτε ότι η "Κωδικοποίηση" βρίσκεται στην κορυφή - "Κωδικοποίηση σε ANSI". Τώρα θα δημιουργήσουμε τεχνητά πρόβλημα με την κωδικοποίηση. Δοκιμάστε να ανοίξετε αυτό το αρχείο στο πρόγραμμα περιήγησής σας τώρα. Θα δούμε ιερογλυφικά. Το θέμα εδώ είναι ότι δημιουργήσαμε το αρχείο μας σε κωδικοποίηση ANSI (Κυριλλική) και ενημερώθηκε στο πρόγραμμα περιήγησης ότι το αρχείο μας βρίσκεται στην κωδικοποίηση utf-8 ( ) .

Οι λόγοι γιατί προβλήματα με την κωδικοποίηση στον ιστότοπο:

1) Εσφαλμένη τιμή του χαρακτηριστικού συνόλου χαρακτήρων της μετα-ετικέτας.

2) Στο μενού Notepad++, ελέγξτε ότι η κωδικοποίηση του αρχείου είναι utf-8. Αυτό πρέπει να γίνει "Κωδικοποιήσεις" - "Κωδικοποίηση σε UTF-8 (χωρίς BOM)". Στο Διαδίκτυο μπορείτε να βρείτε έναν ορισμό του τι είναι "BOM", αλλά δεν είναι σαφές. Όπως καταλαβαίνω, στην αρχή του εγγράφου, είναι γραμμένο μη σπάζοντας χώρομε μηδενικό πλάτος. Δεν το χρειαζόμαστε, οπότε βάζετε πάντα "χωρίς BOM".

3) Συμβαίνει να συμπληρωθούν τα δύο πρώτα σημεία, αλλά εξακολουθούν να εμφανίζονται ανοησίες στις σελίδες του ιστότοπου. Εδώ το πρόβλημα μπορεί να είναι στις ρυθμίσεις διακομιστή, π.χ. Η φιλοξενία μεταφέρει απευθείας κεφαλίδες για τα αρχεία μας και ορίζει την προεπιλεγμένη κωδικοποίηση. Ας προσπαθήσουμε να τον απογαλακτίσουμε από το να το κάνει αυτό. Θα πρέπει να υπάρχει ένα αρχείο .htaccess στον ριζικό κατάλογο του ιστότοπου. Χρησιμοποιώντας αυτό το αρχείο, μπορείτε να κάνετε προσαρμογές στη λειτουργία φιλοξενίας. Εάν δεν έχετε αυτό το αρχείο, τότε πρέπει να το δημιουργήσετε. Είναι βολικό να το κάνετε αυτό μέσα Επεξεργαστής σημειωματάριων++. ΣΕ αυτό το αρχείοπρέπει να γράψετε τον παρακάτω κώδικα:

AddDefaultCharset UTF-8

Με αυτήν την οδηγία λέμε στον διακομιστή ότι η προεπιλεγμένη κωδικοποίηση είναι "utf-8". Εάν αυτό δεν βοηθήσει, τότε πρέπει να γράψετε τον ακόλουθο κώδικα στο ίδιο αρχείο:

Charsetdisable στο AddDefaultCharset Off

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

Δημιουργήστε μια φόρμα σχολίων

Σχετικά με προβλήματα με την κωδικοποίηση αρχείων

Κατά τη δημιουργία μιας φόρμας σχολίων, συχνά προκύπτουν προβλήματα με την κωδικοποίηση αρχείων, γι' αυτό και το εισερχόμενο μήνυμα Επιστολή ηλεκτρονικού ταχυδρομείουαποτελείται από υπέροχα τετράγωνα, διαμάντια και άλλα «κράκερ».

Ας ρίξουμε μια πιο προσεκτική ματιά σε αυτήν την κραυγαλέα παρεξήγηση. Όπως γνωρίζετε, η κωδικοποίηση (charset) είναι μια μέθοδος αναπαράστασης χαρακτήρων για τη μετάδοσή τους. Εξάλλου, κάθε πληροφορία που κυκλοφορεί σε έναν υπολογιστή είναι μια ακολουθία μηδενικών και μονάδων. Η κωδικοποίηση χαρακτήρων αποτελείται από πολλά byte, συνήθως από 1 έως 4. Υπάρχουν πολλές κωδικοποιήσεις και το πρόγραμμα περιήγησης πρέπει να προσδιορίσει σωστά σε ποια από αυτές είναι γραμμένη η σελίδα του ιστότοπου που ανοίγει.

Στις περισσότερες περιπτώσεις σύγχρονα προγράμματα περιήγησηςνα αντιμετωπίσει με επιτυχία αυτό το έργο ανεξάρτητα. Ωστόσο, για να προσδιορίσετε σωστά την κωδικοποίηση, είναι σύνηθες να παρέχετε μια υπόδειξη στον κώδικα HTML χρησιμοποιώντας μια μετα-ετικέτα, για παράδειγμα,
ή
.
.

Οι αρχάριοι σχεδιαστές ιστοσελίδων μερικές φορές πιστεύουν λανθασμένα ότι αρκεί η εισαγωγή απαιτούμενη μετα-ετικέταστην κορυφή της σελίδας - και όλα θα πάνε καλά! Είναι μια αυταπάτη. Όπως σωστά έγραψε ο Kozma Prutkov: «Αν δείτε την επιγραφή «Buffalo» σε ένα κλουβί με έναν ελέφαντα, μην πιστεύετε στα μάτια σας». Είναι απαραίτητο όχι μόνο να γράψετε, για παράδειγμα, charset=utf-8, αλλά και να διασφαλίσετε ότι η σελίδα όντως γίνεται με την καθορισμένη κωδικοποίηση.

Ο ευκολότερος τρόπος για να μάθετε την πραγματική κωδικοποίηση μιας σελίδας είναι ανοίγοντάς την σε οποιοδήποτε πρόγραμμα περιήγησης και επιλέγοντας το στοιχείο στο μενού Προβολή - Κωδικοποίηση. Όταν αλλάζετε κωδικοποιήσεις, προσδιορίστε ποια από αυτές θα εμφανίσει σωστά τη σελίδα - αυτή θα είναι η πραγματική σας κωδικοποίηση. Υποδείξτε το στη μετα-ετικέτα. Εάν θέλετε να αλλάξετε την κωδικοποίηση, τότε για να το κάνετε αυτό πρέπει να μεταβείτε στις ρυθμίσεις του προγράμματος με το οποίο δημιουργείτε τον ιστότοπο και να ορίσετε την απαιτούμενη κωδικοποίηση. Για παράδειγμα, στο πρόγραμμα Adobe DreamweaverΓια να το κάνετε αυτό, πρέπει να επιλέξετε μια ενότητα μενού Επεξεργασία - Ρυθμίσεις... - Δημιουργία εγγράφου - Προεπιλεγμένη κωδικοποίηση. Συνήθως χρησιμοποιούνται κωδικοποιήσεις charset=utf-8ή charset=windows-1251.

Σχόλιο: Συνιστάται να τοποθετήσετε τη μετα-ετικέτα που υποδεικνύει την κωδικοποίηση στην αρχή του κώδικα HTML αμέσως μετά την ετικέτα έτσι ώστε το πρόγραμμα περιήγησης να επιλέξει τη σωστή κωδικοποίηση πριν εμφανίσει τον τίτλο της σελίδας (ετικέτα ...), που εμφανίζεται στη μπλε γραμμή στο επάνω μέρος του παραθύρου του προγράμματος περιήγησης. Διαφορετικά, αντί μπορούμε ακόμα να δούμε τα ίδια υπέροχα τετράγωνα και διαμάντια.</p> </blockquote> <p>Εντελώς περιττά προβλήματα κωδικοποίησης προκύπτουν επίσης όταν μια σελίδα ιστότοπου αποτελείται από πολλά αρχεία, για παράδειγμα, εισαγωγή πλαισίων, σενάρια <b>JavaScript</b>και ούτω καθεξής. Είναι απαραίτητο να διασφαλιστεί ότι όλα αυτά τα μέρη δημιουργούνται με την ίδια κωδικοποίηση. Παρεμπιπτόντως, είναι ακριβώς για αυτήν την περίπτωση που στα προγράμματα αλληλογραφίας, για παράδειγμα, στο mail.ru, υπάρχουν συνήθως πολλά κουμπιά για χειροκίνητη εναλλαγή κωδικοποιήσεων, καθώς μερικές φορές είναι δύσκολο να προσδιοριστεί αυτόματα σε ποια κωδικοποίηση φθάνει ένα γράμμα στο ταχυδρομείο είναι γραμμένο.</p> <p>Επιστρέφοντας στη φόρμα σχολίων, σημειώστε ότι τα δεδομένα κωδικοποίησης μηνυμάτων ενδέχεται να αλλάξουν κατά την προώθηση. Απλοποιημένος, ο μηχανισμός για την παράδοση μιας επιστολής από μια φόρμα στο email σας μοιάζει με αυτό. Πρώτα, το γράμμα φτάνει στο ενδιάμεσο <a href="https://radiobud.ru/el/ios/kreplenie-pochtovogo-yashchik-na-zabor-iz-profnastila-originalnye-resheniya-ulichnyi-pochtovyi-yashchik-svoimi.html">Γραμματοκιβώτιο</a>στον διακομιστή φιλοξενίας σας και από αυτόν αποστέλλεται στη διεύθυνση που καθορίσατε στο αρχείο PHP. Μπορείτε εύκολα να βρείτε αυτό το ενδιάμεσο πλαίσιο κοιτάζοντας στον πίνακα ελέγχου του ιστότοπού σας στην ενότητα <b>Ταχυδρομείο</b>. Όλη αυτή η διαδικασία πραγματοποιείται υπό τον έλεγχο του προγράμματος PHP. Επομένως, είναι επίσης χρήσιμο να υποδείξετε για άλλη μια φορά τη σωστή κωδικοποίηση του αρχείου σας.</p> <p>Για να το κάνετε αυτό, πρέπει στο αρχείο PHP (στη φόρμα μας <a href="https://radiobud.ru/el/life-hacks-for-pc/obzor-plaginov-dlya-sozdaniya-formy-obratnoi-svyazi-forma-obratnoi-svyazi.html">ανατροφοδότηση</a>Αυτό <b>mail.php</b>) προσθήκη γραμμής κεφαλίδας ( <b>κεφαλίδες</b>), το οποίο χρησιμεύει για τον προσδιορισμό σε <a href="https://radiobud.ru/el/life-hacks-for-pc/nastroiki-pochtovyh-programm-dlya-ispolzovaniya-imap-servera-dlya.html">πρόγραμμα αλληλογραφίας</a>μερικοί <a href="https://radiobud.ru/el/life-hacks-for-different-systems/primenenie-mk-avr-shemy-algoritmy-programmy-gde-i-kak-uchitsya.html">πρόσθετες παραμέτρους</a>γράμματα: τύπος εγγράφου <b>κείμενο/απλό</b>(απλό κείμενο), διεύθυνση αποστολέα, κωδικοποίηση κ.λπ. Για την περίπτωσή μας, ας προσθέσουμε την ακόλουθη γραμμή κεφαλίδας( <b>κεφαλίδες</b>) υποδεικνύοντας την κωδικοποίηση: <br>$to = "pupkin@rambler.ru"; //Εισαγάγετε τη διεύθυνσή σας εδώ <br>$headers = "Τύπος περιεχομένου: κείμενο/απλό; charset=utf-8"; <br>$subject = "Μήνυμα από τον ιστότοπό σας"; <br>$message = "Όνομα αποστολέα: $name \nΔιεύθυνση ηλεκτρονικού ταχυδρομείου: $email \nΜήνυμα: $mess"; <br>$send = mail($to, $subject, $message, $headers);</p> <p>Είναι επίσης καλή ιδέα να ενημερώσετε το πρόγραμμα περιήγησης σχετικά με τη σωστή κωδικοποίηση προσθέτοντας μια κεφαλίδα με μετα-ετικέτα στη σελίδα PHP για την υποβολή της φόρμας σχολίων (δείτε «Δημιουργία φόρμας σχολίων») <br> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />.</p> <p>Προβλήματα με την κωδικοποίηση προκύπτουν επίσης εάν χρησιμοποιείτε σενάρια στη σελίδα για να εμφανίσετε οποιοδήποτε κείμενο, για παράδειγμα, ένα ticker, μια ημερομηνία κ.λπ. Για να αλλάξετε την κωδικοποίηση σεναρίου μπορείτε να χρησιμοποιήσετε <b><a href="https://radiobud.ru/el/ios/zacherkivanie-klavishi-bystrogo-dostupa-dlya-ms-word-excel-outlook-ustanovka.html">Microsoft Word</a> </b>. Για να το κάνετε αυτό, ανοίξτε το έγγραφο, ορίστε την επιθυμητή κωδικοποίηση εάν εξάγεται λανθασμένα (ανατρέξτε στη Βοήθεια του Word για το πώς να το κάνετε αυτό) και, στη συνέχεια, αποθηκεύστε το ως εξής: <b>Αρχείο - Αποθήκευση ως - Απλό κείμενο - Αποθήκευση</b>. Στο παράθυρο που ανοίγει, μπορείτε να ορίσετε την απαιτούμενη κωδικοποίηση που ταιριάζει με την κωδικοποίηση της σελίδας σας. <br></p> <p>Δυστυχώς, τα περιγραφόμενα <a href="https://radiobud.ru/el/life-hacks-wi-fi/udobnye-oblegchayushchie-rabotu-priemy-v-fotoshop-prostye-pri-my.html">απλές τεχνικές</a>Ο καθορισμός της κωδικοποίησης δεν εξαλείφει πάντα τα σφάλματα κατά τον προσδιορισμό της. Μερικές φορές απαιτείται σημαντική χειρουργική επέμβαση για τη λειτουργία του μηχανήματος PHP. Μπορείτε εύκολα, αλλά αν θέλετε, να βρείτε τις απαραίτητες πληροφορίες για τέτοιες λειτουργίες σε έναν κατάλογο που ονομάζεται "Internet" - το ποντίκι είναι στα χέρια σας!</p> <p><i>18/03/2011</i></p> <ul>Περισσότερα άρθρα σχετικά με το θέμα "Δημιουργία, βελτιστοποίηση και προώθηση ιστότοπου":</ul> <script type="text/javascript"> <!-- var _acic={dataProvider:10};(function(){var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://www.acint.net/aci.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})() //--> </script><br> <br> <script>document.write("<img style='display:none;' src='//counter.yadro.ru/hit;artfast_after?t44.1;r"+ escape(document.referrer)+((typeof(screen)=="undefined")?"": ";s"+screen.width+"*"+screen.height+"*"+(screen.colorDepth? screen.colorDepth:screen.pixelDepth))+";u"+escape(document.URL)+";h"+escape(document.title.substring(0,150))+ ";"+Math.random()+ "border='0' width='1' height='1' loading=lazy loading=lazy>");</script> </div> </article> <div class='yarpp-related'> <div class="related-items"> <div class="headline">Προτείνουμε άλλα άρθρα</div> <div class="items"> <div class="item"> <a href="https://radiobud.ru/el/iron/strukturirovannaya-kabelnaya-sistema-9395-strukturirovannaya-kabelnaya.html" class="item__link"> <img src="/uploads/dbf46269ce1e2309b9dabaeed0f5f3ef.jpg" width="220" height="170" alt="Σύστημα δομημένης καλωδίωσης (SCS)" class="item__image" / loading=lazy loading=lazy> <div class="item__title">Σύστημα δομημένης καλωδίωσης (SCS)</div> </a> </div> <div class="item"> <a href="https://radiobud.ru/el/ios/twitch-servis-dlya-video-translyacii-strimov-tvich-twitch-chto-eto-i-kak.html" class="item__link"> <img src="/uploads/fff6799ee59d8502f5ed771cdcd8324b.jpg" width="220" height="170" alt="Twitch: τι είναι και πώς λειτουργεί;" class="item__image" / loading=lazy loading=lazy> <div class="item__title">Twitch: τι είναι και πώς λειτουργεί;</div> </a> </div> <div class="item"> <a href="https://radiobud.ru/el/reviews/kak-prazdnovat-letnee-solncestoyanie-kak-prazdnovat-letnee-solncestoyanie.html" class="item__link"> <img src="/uploads/d002eb7ee7f8ca5839027a5ec58464a2.jpg" width="220" height="170" alt="Πώς να γιορτάσετε το Θερινό Ηλιοστάσιο Emmanuelle Daguerre: Ένα θεραπευτικό ηλιοστάσιο" class="item__image" / loading=lazy loading=lazy> <div class="item__title">Πώς να γιορτάσετε το Θερινό Ηλιοστάσιο Emmanuelle Daguerre: Ένα θεραπευτικό ηλιοστάσιο</div> </a> </div> </div> </div> </div> </main> <aside class="sidebar"> <div class="section"> <div class="section__headline">Δημοφιλέστερος</div> <div class="sidebar-items"> <a class="sidebar-item" href="https://radiobud.ru/el/internet/programmirovanie-mikrokontrollerov-dlya-nachinayushchih-legko-i.html"> <img src="/uploads/ace204ea07f98eba1735a36a4ab8ecb6.jpg" width="75" height="75" alt="Προγραμματισμός μικροελεγκτών AVR για αρχάριους Προγραμματισμός ελεγκτών avr για αρχάριους" class="sidebar-item__image" / loading=lazy loading=lazy> <div class="sidebar-item__title">Προγραμματισμός μικροελεγκτών AVR για αρχάριους Προγραμματισμός ελεγκτών avr για αρχάριους</div> </a> <a class="sidebar-item" href="https://radiobud.ru/el/life-hacks-for-ios/pochemu-planshet-ne-vyklyuchaetsya-chto-delat-zavis-planshet---chto-delat-vozmozhnye.html"> <img src="/uploads/2df7bea5ce83ad887e3040165488a737.jpg" width="75" height="75" alt="Παγωμένο tablet - τι να κάνετε;" class="sidebar-item__image" / loading=lazy loading=lazy> <div class="sidebar-item__title">Παγωμένο tablet - τι να κάνετε;</div> </a> <a class="sidebar-item" href="https://radiobud.ru/el/program/videonablyudenie-cherez-usb-kameru-besprovodnaya-usb-kamera-kupit.html"> <img src="/uploads/c5ad1ebb2eec805aceb765a476962621.jpg" width="75" height="75" alt="Ασύρματη κάμερα USB αγοράστε μια ασύρματη μίνι κάμερα υπολογιστή Ψηφιακή κάμερα με έξοδο USB" class="sidebar-item__image" / loading=lazy loading=lazy> <div class="sidebar-item__title">Ασύρματη κάμερα USB αγοράστε μια ασύρματη μίνι κάμερα υπολογιστή Ψηφιακή κάμερα με έξοδο USB</div> </a> <a class="sidebar-item" href="https://radiobud.ru/el/life-hacks-for-pc/sem-putei-voiti-v-svoi-lichnyi-kabinet-stoloto-russkoe-loto-obman.html"> <img src="/uploads/ef0eb579f517d663a977671e7a51ce14.jpg" width="75" height="75" alt="Stoloto, Russian Lotto – απάτη;" class="sidebar-item__image" / loading=lazy loading=lazy> <div class="sidebar-item__title">Stoloto, Russian Lotto – απάτη;</div> </a> <a class="sidebar-item" href="https://radiobud.ru/el/internet/v-chem-smysl-maininga-kak-rabotaet-maining-kriptovalyuty-process.html"> <img src="/uploads/e7ccb6fbe0cf024cedb045c511cf5fad.jpg" width="75" height="75" alt="Πώς λειτουργεί η εξόρυξη κρυπτονομισμάτων Διαδικασία εξόρυξης κρυπτονομισμάτων" class="sidebar-item__image" / loading=lazy loading=lazy> <div class="sidebar-item__title">Πώς λειτουργεί η εξόρυξη κρυπτονομισμάτων Διαδικασία εξόρυξης κρυπτονομισμάτων</div> </a> <a class="sidebar-item" href="https://radiobud.ru/el/game/professiya-programmist-dlya-detei-konspekt-zanyatiya-v-detskom.html"> <img src="/uploads/9d0201b81adc610408d4507ccf6f9186.jpg" width="75" height="75" alt="Σύνοψη ενός μαθήματος στο νηπιαγωγείο "Ο προγραμματιστής είναι ένας μεγάλος μάγος"" class="sidebar-item__image" / loading=lazy loading=lazy> <div class="sidebar-item__title">Σύνοψη ενός μαθήματος στο νηπιαγωγείο "Ο προγραμματιστής είναι ένας μεγάλος μάγος"</div> </a> </div> </div> <script> // <![CDATA[ $(document).ready(function() { var floatsidebar = $("#float-sidebar"); var offset = floatsidebar.offset(); var left = offset.left; var top = offset.top; var width = $("#float-sidebar").width(); var height = $("#float-sidebar").height(); $(window).scroll(function() { var scrollTop = $(window).scrollTop(); if (scrollTop >= top) { $('#float-sidebar').css({ left: left + 'px', position: 'fixed', top: "50px", width: width + "px" }); } else { $('#float-sidebar').css({ position: 'static', }); } }); }); // ]]> </script> <div id="float-sidebar"> <div id="laqybe1" style="height:500px;width:270px;" align="center"></div> </div> </aside> </div> <footer class="footer"> <div class="footer-left"> <div class="footer__logo"> <div class="footer__logo-sitename">radiobud.ru</div> </div> <div class="footer__copyright"> <p>© 2024 - radiobud.ru <br /></p> <p>Κριτικές, life hacks, παιχνίδια, προγράμματα</p> </div> <nav class="footer__nav-1"> <ul> <li class="menu-item type-post_type object-page "><a href="https://radiobud.ru/el/sitemap.xml">Χάρτης τοποθεσίας</a></li> </ul> </nav> </div> <nav class="footer__nav-2"><ul> <li class="menu-item type-taxonomy object-category "><a href="https://radiobud.ru/el/feedback.html">Επαφές</a></li> <li class="menu-item type-taxonomy object-category "><a href="">Διαφήμιση</a></li> <li class="menu-item type-taxonomy object-category "><a href="">Σχετικά με τον ιστότοπο</a></li> </ul></nav> <div class="footer__counters"> </div> <div class="footer__note"></div> </footer> </div> </div> <script type='text/javascript' src='https://radiobud.ru/wp-content/themes/radiobud.ru/js/scripts.js'></script> <script type='text/javascript' src='/wp-includes/js/comment-reply.min.js?ver=4.9.1'></script> <script type='text/javascript'> /* <![CDATA[ */ var tocplus = { "smooth_scroll":"1","visibility_show":"\u043f\u043e\u043a\u0430\u0437\u0430\u0442\u044c","visibility_hide":"\u0421\u043a\u0440\u044b\u0442\u044c","width":"Auto"} ; /* ]]> */ </script> <script type='text/javascript' src='https://radiobud.ru/wp-content/plugins/table-of-contents-plus/front.min.js?ver=1509'></script> <script type='text/javascript' src='/wp-includes/js/wp-embed.min.js?ver=4.9.1'></script> <script async="async" type='text/javascript' src='https://radiobud.ru/wp-content/plugins/akismet/_inc/form.js?ver=4.0.2'></script> <script type="text/javascript"> <!-- var _acic={dataProvider:10};(function(){var e=document.createElement("script");e.type="text/javascript";e.async=true;e.src="https://www.acint.net/aci.js";var t=document.getElementsByTagName("script")[0];t.parentNode.insertBefore(e,t)})() //--> </script><br> <br> </body> </html>