Dlaczego angielskie postacie potrzebują mniej bajtów do ich reprezentacji niż postacie z innych alfabetów?
Podczas gdy większość z nas prawdopodobnie nigdy nie przestała o tym myśleć, znaki alfabetyczne nie mają tego samego rozmiaru co liczba bajtów potrzebnych do ich reprezentacji. Ale dlaczego tak jest? Dzisiejszy post z pytaniami i odpowiedziami dla SuperUser zawiera odpowiedzi na ciekawe pytanie czytelnika.
Dzisiejsza sesja pytań i odpowiedzi przychodzi do nas dzięki uprzejmości SuperUser - poddziału Stack Exchange, opartego na społecznościach grupowania witryn z pytaniami i odpowiedziami.
Partial ASCII Chart screenshot dzięki uprzejmości Wikipedii.
Pytanie
Czytnik superużytkowników khajvah chce wiedzieć, dlaczego różne alfabety zajmują różne ilości miejsca na dysku po zapisaniu:
Kiedy wstawiam "a" do pliku tekstowego i zapiszę go, robi to 2 bajty. Ale kiedy umieściłem znak "ա" (litera z alfabetu ormiańskiego), powoduje to, że ma rozmiar 3 bajty.
Jaka jest różnica między alfabetami na komputerze? Dlaczego angielski zajmuje mniej miejsca po zapisaniu?
Litery to litery, prawda? Może nie! Jaka jest odpowiedź na tę alfabetyczną tajemnicę?
Odpowiedź
Współautorzy SuperUser Doktoro Reichard i ernie mają dla nas odpowiedź. Najpierw, Doktoro Reichard:
Jednym z pierwszych programów kodowania, które mają zostać opracowane do użytku w głównych komputerach jest ASCII (Amerykański Standardowy Kod do Wymiany Informacji) standard. Został opracowany w 1960 roku w Stanach Zjednoczonych.
Alfabet angielski wykorzystuje część alfabetu łacińskiego (na przykład w języku angielskim jest kilka akcentowanych słów). W tym alfabecie jest 26 pojedynczych liter, nie biorąc pod uwagę przypadku. W każdym schemacie, który udaje, że koduje alfabet angielski, muszą istnieć pojedyncze cyfry i znaki interpunkcyjne.
Lata sześćdziesiąte to także czas, w którym komputery nie mają wystarczającej ilości pamięci lub miejsca na dysku, które mamy teraz. ASCII został opracowany jako standardowa reprezentacja funkcjonalnego alfabetu we wszystkich amerykańskich komputerach. W tym czasie podjęto decyzję o wykonaniu każdego znaku ASCII o długości 8 bitów (1 bajt) ze względu na szczegóły techniczne czasu (artykuł Wikipedii wspomina o tym, że taśma perforowana mieściła 8 bitów na raz). W rzeczywistości oryginalny schemat ASCII może być przesyłany przy użyciu 7 bitów, a ósmy może być używany do kontroli parzystości. Późniejsze wydarzenia rozszerzyły pierwotny schemat ASCII o kilka znaków akcentowanych, matematycznych i końcowych.
Wraz z ostatnim wzrostem korzystania z komputera na całym świecie coraz więcej osób z różnych języków miało dostęp do komputera. Oznaczało to, że dla każdego języka trzeba było opracować nowe schematy kodowania, niezależnie od innych schematów, które byłyby sprzeczne, gdyby były czytane z różnych terminali językowych.
Unicode powstało jako rozwiązanie dla istnienia różnych terminali, łącząc wszystkie możliwe znaczące znaki w jeden abstrakcyjny zestaw znaków.
UTF-8 jest jednym ze sposobów kodowania zestawu znaków Unicode. Jest to kodowanie o zmiennej szerokości (tzn. Różne znaki mogą mieć różne rozmiary) i zostało zaprojektowane dla wstecznej zgodności z poprzednim schematem ASCII. Jako taki, zestaw znaków ASCII pozostanie jednobajtowy, podczas gdy każdy inny znak ma dwa lub więcej bajtów. UTF-16 to inny sposób kodowania zestawu znaków Unicode. W porównaniu do UTF-8 znaki są kodowane jako zestaw jednej lub dwóch 16-bitowych jednostek kodu.
Jak stwierdzono w innych komentarzach, znak "a" zajmuje jeden bajt, podczas gdy "ա" zajmuje dwa bajty, oznaczające kodowanie UTF-8. Dodatkowy bajt w pierwotnym pytaniu wynikał z istnienia znaku nowej linii na końcu.
Poniżej znajduje się odpowiedź od Ernie:
1 bajt składa się z 8 bitów i może reprezentować do 256 (2 ^ 8) różnych wartości.
W przypadku języków, które wymagają więcej możliwości, nie można zachować prostego odwzorowania 1 do 1, więc do przechowywania postaci potrzeba więcej danych.
Zauważ, że ogólnie większość kodowań używa pierwszych 7 bitów (128 wartości) dla znaków ASCII. Pozostawia 8 bit lub 128 więcej wartości dla większej liczby znaków. Dodawaj znaki akcentowane, języki azjatyckie, cyrylicę itp. I łatwo zrozumiesz, dlaczego 1 bajt nie jest wystarczający do przechowywania wszystkich znaków.
Czy masz coś do dodania do wyjaśnienia? Dźwięk w komentarzach. Chcesz przeczytać więcej odpowiedzi od innych użytkowników Stack Exchange, którzy znają się na technologii? Sprawdź cały wątek dyskusji tutaj.