30

Когда я помещаю «a» в текстовый файл, он делает его 2 байта, но когда я помещаю, скажем, «ա», который является буквой армянского алфавита, он делает это 3 байта.

В чем разница между алфавитами для компьютера?
Почему английский занимает меньше места?

7 ответов7

41

Одной из первых схем кодирования, которая будет разработана для использования в основных компьютерах, является стандарт ASCII (американский стандартный код для обмена информацией). Он был разработан в 1960-х годах в Соединенных Штатах.

Английский алфавит использует часть латинского алфавита (например, в английском языке мало акцентированных слов). В этом алфавите 26 отдельных букв, не учитывая регистр. И в любой схеме, которая претендует на кодирование английского алфавита, должны были бы существовать отдельные цифры и знаки препинания.

1960-е годы также были временем, когда у компьютеров не было того объема памяти или дискового пространства, который есть у нас сейчас. ASCII был разработан, чтобы быть стандартным представлением функционального алфавита на всех американских компьютерах. В то время решение сделать каждый символ ASCII длиной 8 бит (1 байт) было принято из-за технических деталей того времени (статья в Википедии упоминает тот факт, что перфорированная лента удерживала 8 битов в позиции за раз). Фактически, исходная схема ASCII может быть передана с использованием 7 битов, восемь могут быть использованы для проверок четности. Более поздние разработки расширили исходную схему ASCII, включив в нее несколько акцентированных, математических и терминальных символов.

С недавним увеличением использования компьютеров во всем мире все больше людей с разных языков получили доступ к компьютеру. Это означало, что для каждого языка необходимо было разрабатывать новые схемы кодирования независимо от других схем, которые могли бы конфликтовать при чтении с разных языковых терминалов.

Unicode пришел как решение для существования различных терминалов, объединяя все возможные значимые символы в один абстрактный набор символов.

UTF-8 - это один из способов кодирования набора символов Unicode. Это кодирование переменной ширины (например, разные символы могут иметь разные размеры), и оно было разработано для обратной совместимости с прежней схемой ASCII. Таким образом, набор символов ASCII останется одним байтом большого размера, в то время как любые другие символы имеют два или более байтов большого размера. UTF-16 - это еще один способ кодирования набора символов Unicode. По сравнению с UTF-8 символы кодируются как набор из одной или двух 16-битных кодовых единиц.

Как указано в комментариях, символ «а» занимает один байт, а символ «ա» занимает два байта, обозначая кодировку UTF-8. Дополнительный байт в вашем вопросе был связан с существованием символа новой строки в конце (о котором узнал ОП).

17

1 байт равен 8 битам и может, таким образом, представлять до 256 (2 ^ 8) различных значений.

Для языков, которые требуют больше возможностей, чем это, простое сопоставление 1: 1 не может поддерживаться, поэтому для хранения символа требуется больше данных.

Обратите внимание, что обычно в большинстве кодировок используются первые 7 бит (128 значений) для символов ASCII . Это оставляет 8-й бит или еще 128 значений для большего количества символов. , , добавьте акцентированные символы, азиатские языки, кириллицу и т. д., и вы легко поймете, почему 1 байт недостаточно для хранения всех символов.

10

В UTF-8 символы ASCII используют один байт, другие символы используют два, три или четыре байта.

3

Количество байтов, необходимое для символа (о чем, очевидно, вопрос), зависит от кодировки символов. Если вы используете кодировку ArmSCII, каждая армянская буква занимает всего один байт. Это не очень хороший выбор в наши дни.

В кодировке передачи UTF-8 для Unicode символам требуется разное количество байтов. В нем «а» занимает всего один байт (идея о двух байтах - своего рода путаница), «а» - два байта, а армянская буква айб «ա» - тоже два байта. Три байта должны быть какой-то путаницей. Напротив, например, бенгальская буква «অ» занимает три байта в UTF-8.

Фоном просто является то, что UTF-8 был разработан, чтобы быть очень эффективным для символов Ascii, довольно эффективным для систем письма в Европе и окрестностях, а все остальное менее эффективно. Это означает, что для базовых латинских букв (из которых в основном состоит английский текст) для символа требуется только один байт; для греческого, кириллического, армянского и некоторых других необходимо два байта; все остальное нужно больше.

UTF-8 имеет (как указано в комментарии) также полезное свойство, заключающееся в том, что данные Ascii (когда они представлены в виде 8-битных блоков, которые долгое время были почти единственным способом) также тривиально кодируются в UTF-8.

3

Коды символов в 1960-х (и далеко за их пределами) были машинно-специфическими. В 1980-х я кратко использовал машину DEC 2020, которая имела 36-битные слова и 5, 6 и 8 (IIRC) бит на кодировку символов. До этого я использовал серию IBM 370 с EBCDIC. ASCII с 7 битами привел порядок, но он получил путаницу с "кодовыми страницами" IBM PC, использующими все 8 битов для представления дополнительных символов, например всевозможные рисования блоков для рисования примитивных меню, и более поздние расширения ASCII, такие как Latin-1 (8 бит кодировки, с первыми 7 битами, такими как ASCII, и второй половиной для "национальных символов", таких как ñ , Ç или другие. Вероятно, самой популярной была Latin-1, адаптированная для английского и большинства европейских языков с использованием латинских символов (а также ударений и вариантов).

Написание текстового микширования, например, английского и испанского, прошло нормально (просто используйте Latin-1, супернабор обоих), но смешивание всего, что использовало разные кодировки (скажем, включает фрагмент греческого или русского языка, не говоря уже о азиатском языке, таком как японский) настоящий кошмар. Хуже всего было то, что у русского языка и особенно у японцев и китайцев было несколько популярных, совершенно несовместимых кодировок.

Сегодня мы используем Unicode, который объединен с эффективными кодировками, такими как UTF-8, которые предпочитают английские символы (удивительно, что кодировка для английских букв просто так соответствует ASCII), поэтому многие неанглийские символы используют более длинные кодировки.

2

Если вас интересует, как хранятся символы, вы можете зайти на сайт www.unicode.org и осмотреться. Вверху их главной страницы находится ссылка "Кодовые таблицы", в которой показаны все коды символов, доступные в Юникоде.

Всего в Unicode доступно чуть более миллиона кодов (не все они используются). Один байт может содержать 256 разных значений, поэтому вам понадобится три байта, если вы хотите хранить каждый возможный код Unicode.

Вместо этого Unicode обычно хранится в кодировке «UTF-8», которая использует меньше байтов для одних символов и больше для других. Первые 128 кодовых значений хранятся в одном байте, до первых 2048 кодовых значений хранятся в двух байтах, до 65536 хранятся в трех байтах, а остальные занимают четыре байта. Это было организовано таким образом, чтобы используемые значения кода занимали меньше места. AZ, az, 0-9 и!@ $% ^ & *() - [} {}; ':. "|, /<>? и некоторые, которые я забыл, берут один байт; почти весь английский, 98% немецкого и французского (только догадки) могут храниться в одном байте на символ, и эти символы используются чаще всего. Кириллица, греческий, иврит, арабский и некоторые другие используют два байта на символ. Индийские языки, большинство китайских, японских, корейских, тайских, тонны математических символов, могут быть записаны тремя байтами на символ. Редкие вещи (если вы когда-нибудь захотите написать текст в Linear A или Linear B, Emojis) занимают четыре байта.

Другая кодировка - UTF-16. Все, что занимает 1, 2 или 3 байта в UTF-8, занимает два байта в UTF-16. Это преимущество, если у вас есть китайский или японский текст с очень небольшим количеством латинских символов между ними.

О причинах дизайна UTF-8: у него есть несколько преимуществ перед другими конструкциями. Они есть:

Совместимость с символами US-ASCII

Разумная компактность

Самосинхронизация: это означает, что если вам дана часть последовательности байтов, которые являются символами в кодировке UTF-8, вы можете узнать, где начинается символ. В некоторых кодировках xy и yx могут быть допустимыми кодировками символов, поэтому, если вам дана часть последовательности ... xyxyxyxyxyxy ... вы не можете знать, какие символы у вас есть.

Правильность сортировки: если вы сортируете строки, содержащие символы в кодировке UTF-8, по их байтовым значениям, они автоматически сортируются в соответствии со значениями Unicode.

Совместим с однобайтовым кодом: большая часть кода, который принимает однобайтовые значения, автоматически работает правильно с символами в кодировке UTF-8.

Плюс по любым причинам я забыл.

2

Windows 8.1 US/English Файл с одним «а», сохраненный в блокноте.

  • Сохранить как ANSI 1 байт
  • Сохранить как Unicode 4 байта
  • Сохранить как UTF-8 4 байта

Файл с одним «ա» сохранен в блокноте

  • Сохранить как ANSI невозможно
  • Сохранить как Unicode 4 байта
  • Сохранить как UTF-8 5 байт

Отдельный символ 'a' кодируется как один байт в ANSI, в Unicode каждый символ обычно составляет 2 байта, также есть 2-байтовая спецификация (метка порядка байтов) в начале файла. UTF-8 имеет 3-байтовую спецификацию и однобайтовый символ.

Для «ա» этот символ не существует в наборе символов ANSI и не может быть сохранен на моем компьютере. Файл Unicode такой же, как и раньше, а файл UTF-8 на 1 байт больше, поскольку символ занимает 2 байта.

Если ваш компьютер находится в другом регионе, у вас может быть установлена другая кодовая страница OEM, которая имеет различные глифы для 255 символов, возможных в диапазоне ASCII. Как отметил @ntoskrnl, кодовой страницей OEM для моей машины будет Windows-1252, которая используется по умолчанию для английского языка США.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .