Γιατί οι Αγγλικοί χαρακτήρες χρειάζονται λιγότερα byte για να τους αντιπροσωπεύσουν από τους χαρακτήρες σε άλλα αλφάβητα;
Ενώ οι περισσότεροι από εμάς πιθανότατα δεν σταμάτησαν ποτέ να το σκεφτούν, οι αλφαβητικοί χαρακτήρες δεν είναι όλοι το ίδιο μέγεθος στον αριθμό των bytes που χρειάζεται για να τα εκπροσωπήσουν. Αλλά γιατί είναι αυτό; Η σημερινή δημοσίευση Q & A της SuperUser έχει τις απαντήσεις σε μια ερώτηση περίεργου αναγνώστη.
Η σημερινή συνάντηση ερωτήσεων και απαντήσεων έρχεται σε επαφή με το SuperUser - μια υποδιαίρεση του Stack Exchange, μια κοινότητα που κατευθύνεται από τους ιστότοπους ερωτήσεων & απαντήσεων.
Μερική εικόνα του ASCII Chart από την Wikipedia.
Το ερώτημα
Ο αναγνώστης SuperUser khajvah θέλει να μάθει γιατί τα διαφορετικά αλφάβητα καταλαμβάνουν διαφορετικές ποσότητες χώρου στο δίσκο όταν αποθηκεύονται:
Όταν βάζω ένα "a" σε ένα αρχείο κειμένου και το αποθηκεύω, το κάνει 2 byte σε μέγεθος. Αλλά όταν έβαλα ένα χαρακτήρα σαν '' (γράμμα από το αρμενικό αλφάβητο), το κάνει 3 bytes σε μέγεθος.
Ποια είναι η διαφορά μεταξύ των αλφαβήτων σε έναν υπολογιστή; Γιατί τα αγγλικά καταλαμβάνουν λιγότερο χώρο όταν αποθηκεύονται?
Τα γράμματα είναι γράμματα, σωστά; Μάλλον όχι! Ποια είναι η απάντηση σε αυτό το αλφαβητικό μυστήριο?
Η απάντηση
Οι συνδρομητές του SuperUser Doktoro Reichard και ernie έχουν την απάντηση για εμάς. Πρώτα επάνω, Doktoro Reichard:
Ένα από τα πρώτα συστήματα κωδικοποίησης που θα αναπτυχθούν για χρήση σε mainstream υπολογιστές είναι το ASCII (Αμερικανικός τυποποιημένος κώδικας ανταλλαγής πληροφοριών) πρότυπο. Αναπτύχθηκε στη δεκαετία του 1960 στις Ηνωμένες Πολιτείες.
Το αγγλικό αλφάβητο χρησιμοποιεί μέρος του λατινικού αλφαβήτου (για παράδειγμα, υπάρχουν λίγες λόγια με λόγια στα αγγλικά). Υπάρχουν 26 ξεχωριστές επιστολές σε αυτό το αλφάβητο, χωρίς να εξετάζεται περίπτωση. Και θα έπρεπε επίσης να υπάρχουν οι ατομικοί αριθμοί και τα σημεία στίξης σε οποιοδήποτε σχήμα που προσποιείται ότι κωδικοποιεί το αγγλικό αλφάβητο.
Η δεκαετία του 1960 ήταν επίσης μια εποχή που οι υπολογιστές δεν είχαν το μέγεθος της μνήμης ή του χώρου στο δίσκο που έχουμε τώρα. Το ASCII αναπτύχθηκε για να αποτελεί τυπική αναπαράσταση ενός λειτουργικού αλφαβήτου σε όλους τους Αμερικανούς υπολογιστές. Εκείνη την εποχή, η απόφαση να γίνει 8 bit (1 byte) για κάθε χαρακτήρα ASCII έγινε με τεχνικές λεπτομέρειες της εποχής (το άρθρο της Wikipedia αναφέρει το γεγονός ότι η διάτρητη ταινία κρατούσε 8 μπιτ σε μια θέση τη φορά). Στην πραγματικότητα, το αρχικό σύστημα ASCII μπορεί να μεταδοθεί χρησιμοποιώντας 7 bits και το όγδοο θα μπορούσε να χρησιμοποιηθεί για ελέγχους ισοτιμίας. Οι μεταγενέστερες εξελίξεις επέκτειναν το αρχικό σύστημα ASCII ώστε να περιλαμβάνουν πολλούς τόνους, μαθηματικούς και τερματικούς χαρακτήρες.
Με την πρόσφατη αύξηση της χρήσης υπολογιστών σε όλο τον κόσμο, όλο και περισσότεροι άνθρωποι από διαφορετικές γλώσσες είχαν πρόσβαση σε έναν υπολογιστή. Αυτό σήμαινε ότι, για κάθε γλώσσα, έπρεπε να αναπτυχθούν νέα συστήματα κωδικοποίησης, ανεξάρτητα από άλλα συστήματα, τα οποία θα έρχονταν σε σύγκρουση αν διαβάστηκαν από διαφορετικούς γλωσσικούς τερματικούς σταθμούς.
Το Unicode δημιουργήθηκε ως λύση για την ύπαρξη διαφορετικών τερματικών με τη συγχώνευση όλων των πιθανών σημαντικών χαρακτήρων σε ένα απλό αφηρημένο σύνολο χαρακτήρων.
Το UTF-8 είναι ένας τρόπος για να κωδικοποιήσετε το σύνολο χαρακτήρων Unicode. Είναι μια κωδικοποίηση μεταβλητού εύρους (δηλαδή διαφορετικοί χαρακτήρες μπορούν να έχουν διαφορετικά μεγέθη) και έχει σχεδιαστεί για συμβατότητα με το προηγούμενο σύστημα ASCII. Ως εκ τούτου, το σύνολο χαρακτήρων ASCII θα παραμείνει ένα byte σε μέγεθος ενώ όλοι οι άλλοι χαρακτήρες είναι δύο ή περισσότερα bytes σε μέγεθος. Το UTF-16 είναι ένας άλλος τρόπος για την κωδικοποίηση του συνόλου χαρακτήρων Unicode. Σε σύγκριση με το UTF-8, οι χαρακτήρες κωδικοποιούνται ως ένα σύνολο από μία ή δύο μονάδες κώδικα 16 bit.
Όπως αναφέρεται σε άλλες παρατηρήσεις, ο χαρακτήρας 'a' καταλαμβάνει ένα μοναδικό byte ενώ το '' 'καταλαμβάνει δύο bytes, δηλώνοντας μια κωδικοποίηση UTF-8. Το επιπλέον byte στην αρχική ερώτηση οφείλεται στην ύπαρξη ενός χαρακτήρα νέας γραμμής στο τέλος.
Ακολουθούμενη από την απάντηση από το ernie:
1 byte είναι 8 bits, και μπορεί έτσι να αντιπροσωπεύει μέχρι και 256 (2 ^ 8) διαφορετικές τιμές.
Για γλώσσες που απαιτούν περισσότερες δυνατότητες απ 'αυτό, δεν είναι δυνατή η διατήρηση μιας απλής χαρτογράφησης 1 προς 1, επομένως απαιτούνται περισσότερα δεδομένα για την αποθήκευση ενός χαρακτήρα.
Σημειώστε ότι, γενικά, οι περισσότερες κωδικοποιήσεις χρησιμοποιούν τα πρώτα 7 bits (128 τιμές) για τους χαρακτήρες ASCII. Αυτό αφήνει το 8ο bit ή 128 περισσότερες τιμές για περισσότερους χαρακτήρες. Προσθέστε με τους τόνους χαρακτήρες, ασιατικές γλώσσες, κυριλλικά κτλ. Και μπορείτε εύκολα να δείτε γιατί 1 byte δεν αρκεί για την κατοχή όλων των χαρακτήρων.
Έχετε κάτι να προσθέσετε στην εξήγηση; Απενεργοποιήστε τα σχόλια. Θέλετε να διαβάσετε περισσότερες απαντήσεις από άλλους τεχνολογικούς χρήστες Stack Exchange; Δείτε το πλήρες νήμα συζήτησης εδώ.