If-Koubou

Dlaczego angielskie postacie potrzebują mniej bajtów do ich reprezentacji niż postacie z innych alfabetów?

Dlaczego angielskie postacie potrzebują mniej bajtów do ich reprezentacji niż postacie z innych alfabetów? (Jak)

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, społecznościowego forum z pytaniami i odpowiedziami.

Partial ASCII Chart screenshot dzięki uprzejmości Wikipedii.

Pytanie

Czytnik SuperUser 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 umieszczam znak "ա" (litera z alfabetu ormiańskiego), to 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ź

Dostawcy 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 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. Ponadto w każdym schemacie, który udaje się kodować 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 tamtym 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, że ​​taśma perforowana mieściła 8 bitów w jednej pozycji). 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 oryginalny 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 należy 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ł 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 niż to, nie można zachować prostego mapowania 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.