Skip to content

Dlaczego angielskie znaki potrzebują mniej bajtów do ich reprezentacji niż znaki w innych alfabetach?

12 de lipiec de 2021
whydoenglishcharactersneedfewerbytestorepresentthemversuscharactersinotheralphabets00

Podczas gdy większość z nas prawdopodobnie nigdy nie przestała o tym myśleć, znaki alfabetyczne nie mają tej samej wielkości pod względem liczby 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 — pododdziału Stack Exchange, społecznościowej grupy witryn internetowych z pytaniami i odpowiedziami.

Zrzut ekranu częściowego wykresu ASCII dzięki uprzejmości Wikipedia.

Pytanie

Czytnik SuperUser khajvah chce wiedzieć, dlaczego różne alfabety zajmują różne ilości miejsca na dysku po zapisaniu:

Kiedy umieszczam 'a’ w pliku tekstowym i zapisuję go, ma on rozmiar 2 bajtów. Ale kiedy wstawiam znak taki jak „ա” (litera alfabetu ormiańskiego), ma on rozmiar 3 bajtów.

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ółpracownicy SuperUser Doktoro Reichard i ernie mają dla nas odpowiedź. Po pierwsze, Doktoro Reichard:

Jednym z pierwszych schematów kodowania, które zostaną opracowane do użytku w komputerach głównego nurtu, jest ASCII (Amerykański standardowy kod wymiany informacji) standard. Został opracowany w latach 60. w Stanach Zjednoczonych.

Alfabet angielski wykorzystuje część alfabetu łacińskiego (na przykład w języku angielskim jest kilka akcentowanych słów). W alfabecie tym jest 26 pojedynczych liter, nie uwzględniając wielkości liter. Musiałyby też istnieć poszczególne cyfry i znaki interpunkcyjne w każdym schemacie, który udaje, że koduje alfabet angielski.

Lata 60. to także czas, kiedy komputery nie miały takiej ilości pamięci czy miejsca na dysku, jak my teraz. ASCII został opracowany jako standardowa reprezentacja funkcjonalnego alfabetu na wszystkich amerykańskich komputerach. W tamtym czasie decyzja o tym, aby każdy znak ASCII miał długość 8 bitów (1 bajt) została podjęta ze względu na szczegóły techniczne tamtych czasów (artykuł Wikipedii wspomina o tym, że perforowana taśma trzymała jednocześnie 8 bitów). W rzeczywistości oryginalny schemat ASCII może być przesyłany przy użyciu 7 bitów, a ósmy może być użyty do kontroli parzystości. Późniejsze zmiany rozszerzyły oryginalny schemat ASCII o kilka znaków akcentowanych, matematycznych i końcowych.

Wraz z niedawnym wzrostem użycia komputerów 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 odczytywane z terminali w różnych językach.

Unicode powstał jako rozwiązanie istnienia różnych terminali poprzez połączenie wszystkich możliwych znaczących znaków 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 (tj. różne znaki mogą mieć różne rozmiary) i zostało zaprojektowane z myślą o kompatybilności wstecznej z poprzednim schematem ASCII. W związku z tym zestaw znaków ASCII pozostanie w rozmiarze jednego bajta, podczas gdy inne znaki będą miały rozmiar co najmniej dwóch bajtów. UTF-16 to kolejny 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, co oznacza kodowanie UTF-8. Dodatkowy bajt w pierwotnym pytaniu wynikał z istnienia na końcu znaku nowej linii.

Następnie odpowiedź od Erniego:

1 bajt to 8 bitów, a zatem może reprezentować do 256 (2^8) różnych wartości.

W przypadku języków, które wymagają większej liczby możliwości, proste odwzorowanie 1 do 1 nie może być utrzymane, więc do przechowywania znaku potrzeba więcej danych.

Zauważ, że ogólnie większość kodowań używa pierwszych 7 bitów (128 wartości) dla) ASCII postacie. Pozostaje ósmy bit lub 128 więcej wartości dla większej liczby znaków. Dodaj znaki akcentowane, języki azjatyckie, cyrylicę itp., a łatwo zobaczysz, dlaczego 1 bajt nie wystarcza do przechowywania wszystkich znaków.

Masz coś do dodania do wyjaśnienia? Dźwięk w komentarzach. Chcesz przeczytać więcej odpowiedzi od innych doświadczonych technologicznie użytkowników Stack Exchange? Sprawdź pełny wątek dyskusji tutaj.

Czy ten post był pomocny?