Защо английските символи се нуждаят от по-малко байтове, за да ги представят, отколкото символи в други азбуки?
Докато повечето от нас вероятно никога не са спрели да мислят за това, буквените знаци не са с еднакъв размер в броя на байтовете, необходими за представянето им. Но защо? Днешната публикация за въпроси и отговори SuperUser има отговори на един любопитен въпрос на читателя.
Днешната сесия за въпроси и отговори идва при нас с любезното съдействие на SuperUser - подразделение на Stack Exchange, групирано от общността уеб сайтове за въпроси и отговори.
Частично скрийншот на ASCII графиката, предоставен от Уикипедия.
Въпроса
Четецът на SuperUser khajvah иска да знае защо различните азбуки заемат различно количество дисково пространство при запазване:
Когато сложа 'a' в текстов файл и го запазя, той го прави с размер 2 байта. Но когато сложа знак като 'ա' (буква от арменската азбука), той го прави с 3 байта по размер.
Каква е разликата между азбуките на компютъра? Защо английският език заема по-малко място при запазване?
Буквите са букви, нали? Може би не! Какъв е отговорът на тази азбучна мистерия?
Отговорът
Сътрудниците на SuperUser Doktoro Reichard и ernie имат отговор за нас. Първо, Докторо Райхард:
Една от първите схеми за кодиране, които ще бъдат разработени за използване в основните компютри, е ASCII (Американски стандартен код за обмен на информация) стандарт. Тя е разработена през 60-те години в Съединените щати.
Английската азбука използва част от латинската азбука (например, на английски език има няколко акцентирани думи). В тази азбука има 26 отделни букви, които не разглеждат случай. Също така трябва да съществуват отделните числа и препинателни знаци във всяка схема, която претендира да кодира английската азбука.
Шестдесетте години също бяха време, когато компютрите нямаха достатъчно памет или дисково пространство, което имаме сега. ASCII е разработен като стандартно представяне на функционална азбука във всички американски компютри. По онова време решението да се направи всеки ASCII символ с 8 бита (1 байт) дълъг е направено поради техническите детайли на времето (статията в Уикипедия споменава факта, че перфорираната лента съдържа 8 бита на място). Всъщност, оригиналната ASCII схема може да бъде предадена с помощта на 7 бита, а осмата може да се използва за проверки на паритет. По-късните разработки разшириха първоначалната ASCII схема, като включиха няколко символа с ударение, математика и терминал.
С неотдавнашното нарастване на използването на компютри в целия свят все повече хора от различни езици имаха достъп до компютър. Това означаваше, че за всеки език трябваше да бъдат разработени нови схеми за кодиране, независимо от други схеми, които биха били в конфликт, ако се четат от различни езикови терминали..
Unicode се появи като решение за съществуването на различни терминали чрез обединяване на всички възможни смислени знаци в един абстрактен набор от символи.
UTF-8 е един от начините за кодиране на Unicode набора от символи. Това е кодиране с променлива ширина (т.е. различните знаци могат да имат различни размери) и е проектирано за обратна съвместимост с предишната схема ASCII. Като такъв, ASCII наборът от символи ще остане един байт по размер, докато всички други знаци са два или повече байта по размер. UTF-16 е друг начин за кодиране на Unicode набора от символи. В сравнение с UTF-8, символите се кодират или като набор от една или две 16-битови кодови единици.
Както е посочено в други коментари, символът 'a' заема един байт, докато 'ա' заема два байта, обозначавайки UTF-8 кодиране. Допълнителният байт в първоначалния въпрос се дължи на съществуването на символ за нов ред в края.
Следван от отговора на ernie:
1 байт е 8 бита и по този начин може да представлява до 256 (2 ^ 8) различни стойности.
За езици, които изискват повече възможности от това, не може да се поддържа обикновено от 1 до 1 съпоставяне, така че е необходимо повече данни за съхраняване на символ.
Имайте предвид, че по принцип повечето кодировки използват първите 7 бита (128 стойности) за ASCII символи. Това оставя 8-ми бит, или 128 повече стойности за повече символи. Добавете акцентирани символи, азиатски езици, кирилица и т.н. и лесно можете да видите защо 1 байт не е достатъчен за задържане на всички символи.
Имате ли какво да добавите към обяснението? Звучи в коментарите. Искате ли да прочетете повече отговори от други технологични потребители на Stack Exchange? Вижте пълната тема за дискусия тук.