Почему 256 символов используются для обработки текстовой информации на компьютере

Обновлено: 02.07.2024

Байты часто используются для хранения отдельных символов в текстовом документе. В наборе символов ASCII каждому двоичному значению от 0 до 127 соответствует определенный символ. Большинство компьютеров расширяют набор символов ASCII, чтобы использовать весь диапазон из 256 символов, доступных в байте. Верхние 128 символов используются для обработки особых вещей, таких как символы с диакритическими знаками в распространенных иностранных языках.

Вы можете увидеть 127 стандартных кодов ASCII ниже. Компьютеры хранят текстовые документы как на диске, так и в памяти, используя эти коды. Например, если вы используете Блокнот в Windows 95/98 для создания текстового файла, содержащего слова «Четыре балла и семь лет назад», Блокнот будет использовать 1 байт памяти на каждый символ (включая 1 байт на каждый символ пробела между словами). -- символ ASCII 32). Когда Блокнот сохраняет предложение в файле на диске, этот файл также будет содержать 1 байт на символ и на пробел.

Проведите такой эксперимент: откройте новый файл в Блокноте и вставьте в него предложение "Четыре балла и семь лет назад". Сохраните файл на диск под именем getty.txt. Затем используйте проводник и посмотрите на размер файла. Вы обнаружите, что размер файла на диске составляет 30 байт: по 1 байту на каждый символ. Если вы добавите еще одно слово в конец предложения и сохраните его повторно, размер файла увеличится до соответствующего количества байтов. Каждый символ занимает один байт.

Если бы вы посмотрели на файл так, как на него смотрит компьютер, вы бы обнаружили, что каждый байт содержит не букву, а число — число — это код ASCII, соответствующий символу (см. ниже). Итак, на диске номера файла выглядят так:

Посмотрев в таблицу ASCII, вы увидите однозначное соответствие между каждым символом и используемым кодом ASCII. Обратите внимание на использование 32 для пробела — 32 — это код ASCII для пробела. Мы могли бы преобразовать эти десятичные числа в двоичные числа (то есть 32 = 00100000), если бы хотели быть технически правильными — именно так компьютер действительно работает с вещами.

Один бит может иметь 2 возможных состояния. 2 1 =2. 0 или 1.
Два бита могут иметь 4 возможных состояния. 2 2 =4. 00,01,10,11. (т.е. 0-3)
Четыре бита могут иметь 16 возможных состояний. 2 4 =16. 0000,0001,0010,0011 и т. д. (т.е. 0-15)
Семь битов могут иметь 128 возможных состояний. 2 7 =128. 0000000,0000001,0000010 и т. д. (т.е. 0-127).
Восемь битов могут иметь 256 возможных состояний. 2 8 =256. 00000000,00000001,00000010 и т. д. (например, 0–255).

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

Общий код, используемый для символов с диакритическими знаками, — Quoted-Printable. Любые расширенные символы (больше 127) кодируются строкой из трех символов. Например, é = E9. 8BIT (по сути, несжатые символьные данные) также является допустимым кодом MIME и сегодня является наиболее распространенным способом отправки символов с диакритическими знаками.

Чтобы код работал на двух разных машинах с разными операционными системами и разными встроенными наборами символов, мы все должны согласовать стандартные наборы символов, в которые мы будем переводить. Международная организация по стандартизации (ISO) установила такие стандарты. Например, стандартный набор символов для западноевропейских языков — ISO-LATIN-I (или ISO-8859-1). Но пока компьютер знает, какой набор символов используется, его можно запрограммировать на перевод и отображение этих символов, независимо от того, какой у компьютера собственный набор символов. é — это 130-й символ в ISO-LATIN-I.

Программа электронной почты, совместимая с MIME, будет использовать заголовки электронной почты, чтобы отслеживать, какой набор символов и схема кодирования применяются к каждому сообщению электронной почты. Веб-браузер сделает то же самое. Это позволяет программе преобразовывать и знать, как отображать символы на любом заданном компьютере, поэтому вся система кодирования прозрачна (пользователь не замечает) для пользователя. Для MIME Quoted-Printable на западноевропейских языках эти заголовки могут выглядеть так:

    X-Mailer: QUALCOMM Windows Eudora версии 5.1
    Mime-версия: 1.0
    Тип контента: текстовый/обычный; charset=iso-8859-1
    Content-transfer-encoding: quoted-printable

И эти же заголовки MIME также используются на веб-страницах, чтобы веб-браузер, такой как Internet Explorer, Chrome или Firefox, знал, как отображать каждую страницу, независимо от того, где она была создана и где находится. просмотрено. Пока компьютер знает, какой набор символов представлен, он знает, какие символы отображать.

Клавиатуры

Вы также должны в первую очередь ввести символы в компьютер. Windows и Mac уже давно позволяют делать это с помощью сочетаний клавиш.Лучший способ ввода символов в Windows — это выбрать раскладку клавиатуры, которая включает символы, которые вы хотите ввести. Для ввода западноевропейских языков на американской клавиатуре самым безопасным и простым в использовании вариантом, если вы уже знаете, как печатать на американской клавиатуре, является международная клавиатура США. В Windows 7, 8, 10 найдите вкладку «Клавиатуры и языки» на панели управления «Регион и язык», чтобы изменить или добавить клавиатуру. Хотя многие программы могут иметь встроенные сочетания клавиш, преимущество использования клавиатуры в операционной системе (Windows, Mac) заключается в том, что она будет работать для всех программ.

Интерактивную справку по клавиатуре см.:

Справка по клавиатуре

Неанглийские клавиатуры Windows 7 ; Общие для Windows и Mac; Windows 10

Учебник по проблемам с кодами символов

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

Строки

В компьютерной терминологии фрагмент текста чаще называют строкой. В большей степени это помогает избежать каких-либо предположений о содержании, потому что строки могут фактически включать любые символы, не только буквы AZ (как в нижнем, так и в верхнем регистре), но и цифры 0-9, знаки препинания, пробелы, табуляции, разрывы строк и другие «специальные символы». Строка может состоять из одного символа или длиннее, чем «Война и мир». В конечном счете, однако, каждую строку можно разбить на отдельные символы, которые, в свою очередь, состоят из байтов, которые сами по себе являются не чем иным, как восемью битами комбинаций 1 или 0. Но как это работает на практике?

Наборы символов
Юникод

Набор символов ASCII имеет длинную родословную, восходящую к 1960-м годам, первоначально он был получен из поиска, используемого для отправки телеграфных сообщений. Однако он ограничен, поскольку может поддерживать не более 128 различных символов. Это связано с тем, что ASCII использует только 7 бит из 8 бит, доступных в одном байте. Некоторые более поздние версии ASCII, такие как ANSI, расширили исходный набор символов ASCII до 256 различных символов (за счет использования 8-го бита), поскольку, как мы узнали из чисел, один байт может использоваться для хранения до 256 различных чисел. Это дает больше возможностей для включения акцентированных букв (например, ö, ç, ù и т. д.) для поддержки текста на большинстве европейских языков. Однако таким языкам, как китайский, в котором используются идеограммы, а не буквы, требуется много тысяч различных символов, гораздо больше, чем 256. В этом отношении бедный старый ASCII — расширенный или нет — нам не поможет. Однако радость байтов заключается в том, что их совокупная емкость возрастает экспоненциально: если мы используем два байта для хранения каждого символа, мы можем иметь 65 536 различных символов (подробнее о том, почему это так, см. здесь). Наборы символов Unicode, из которых UTF-8 наиболее часто используется в Интернете, делают именно это; на самом деле UTF-8 использует до четырех байтов для одного символа. Конечно, использование дополнительных байтов увеличивает размер хранилища, необходимого для текстовых данных, но UTF-8 аккуратно обходит эту проблему, используя так называемую кодировку символов «переменной ширины». То есть для первых 128 символов — таких же, как в ASCII — используется всего один байт. Для более высоких символов он расширяется на один, два или три дополнительных байта в зависимости от требуемого символа. Это позволяет избежать необходимости использовать четыре байта для каждого символа, сохраняя при этом гибкость поддержки гораздо более широкого набора символов, чем может ASCII.

Пример работы

Используя Блокнот Windows, вы действительно можете увидеть разницу в том, как строковые данные кодируются и хранятся на компьютере. Если вы создадите пустой текстовый файл в Блокноте, вы увидите, что он имеет размер 0 байт:

test1

Это связано с тем, что файл, даже с указанным именем, представляет собой не что иное, как указатель на место хранения до тех пор, пока в файле не появится содержимое. Пока файл остается пустым, это всего лишь указатель на место, содержащее 0 байтов данных. Если теперь открыть файл, ввести одну букву и сохранить его, размер файла увеличится ровно до 1 байта. Однако вам придется проверить свойства файла, чтобы увидеть это, потому что проводник Windows округляет до ближайшего килобайта!

test2

В шестнадцатеричном формате файл будет выглядеть так:

Теперь сохраните файл под другим именем, но в диалоговом окне "Сохранить как" выберите кодировку "UTF-8":

test3

Если вы проверите свойства файла для этого нового файла, вы увидите, что он увеличился до 4 байт. В шестнадцатеричном формате файл теперь выглядит так:

Что занимает дополнительные 3 байта? Ответом является то, что называется «метка порядка байтов» (BOM), которая представляет собой стандартный трехбайтовый фрагмент информации, сообщающий любой программе, которая открывает этот файл, что он был закодирован в UTF-8. Те же три байта (в шестнадцатеричном формате: &EF &BB &BF) появятся в начале любого текстового файла, закодированного в UTF-8 такими программами, как Блокнот Windows. Не является требованием, чтобы что-то, закодированное в UTF-8, имело этот знак порядка следования байтов в начале, и многие программы пропускают его, включая многие веб-приложения. Однако для программ, которые ожидают его наличия, если его там нет, программа предположит (возможно, неправильно!), что текстовая информация была закодирована в ASCII, потому что ASCII никогда не имеет метки порядка байтов.

Если сейчас вы добавите в файл еще одну букву и продолжите сохранять его в кодировке UTF-8, он увеличится еще на один байт:

test4

Это связано с тем, что, как мы обсуждали выше, UTF-8 представляет собой кодировку символов переменной ширины, и используемый здесь дополнительный символ (буква 'A') не выходит за пределы первых 128 символов. . Мы можем проверить эту теорию дальше, добавив в файл третий символ, на этот раз из кириллицы. Символ Ю (заглавная буква «Ю») не является частью первых 128 символов, но находится в пределах первых 65 536 символов, поэтому для его хранения потребуется всего два байта. Конечно же, когда мы сейчас проверяем свойства файла, файл вырос с 5 байт до 7 байтов:

test5

В шестнадцатеричном формате вы можете видеть, что один дополнительный символ дал нам еще два байта (&D0 и &AE):

Что произойдет, если мы сейчас сохраним этот же файл, используя ANSI? Если вы попробуете это, вы получите предупреждение от Блокнота о том, что файл содержит символы в формате Unicode, которые будут потеряны, если вы продолжите. В любом случае нажмите «ОК», а затем посмотрите свойства файла… размер файла уменьшился до 3 байт!

test6

В шестнадцатеричном формате файл теперь выглядит так:

Это связано с тем, что первые три байта метки порядка следования байтов были удалены (помните, что ни ASCII, ни ANSI не используют метки порядка следования байтов), а дополнительный байт (&AE) для нашей кириллической буквы также был утерян. На самом деле все еще хуже: испорчен даже первый байт (&D0) двухбайтного символа кириллицы. Если вы откроете файл, то увидите, что вместо Ю у нас стоит вопросительный знак (в шестнадцатеричном формате: &3F). Это способ Блокнота показать, что он больше не знает, каким должен быть символ, поскольку дополнительный байт данных был потерян.

Кстати, если вы хотите посмотреть, как файлы на самом деле отображаются на компьютере как в шестнадцатеричном, так и в двоичном виде, может быть интересно (при заданном значении «весело»…) использовать шестнадцатеричный редактор. Эти инструменты позволяют просматривать файлы в их шестнадцатеричном представлении. HxD — хороший бесплатный шестнадцатеричный редактор, который мне нравится использовать. Его можно скачать здесь.

Мы надеемся, что это демонстрирует как наборы символов работают на практике, так и их важность для компьютера при хранении текстовых данных. В следующем посте мы рассмотрим даты…

Дополнительную информацию можно найти в нашем вводном руководстве по HTML и CSS для маркетологов.

человек, программирующий текстовый файл в формате UTF-8

Правда в том, что даже такая простая вещь, как текст, требует хорошо скоординированной, четко определенной системы для отображения в веб-браузерах. В этом посте я объясню основы одной технологии, центральной для текста в Интернете, UTF-8. Мы изучим основы хранения и кодирования текста и обсудим, как это помогает размещать привлекательные слова на вашем сайте.

Прежде чем мы начнем, вы должны быть знакомы с основами HTML и готовы погрузиться в несложную компьютерную науку.

Что такое UTF-8?

UTF-8 расшифровывается как «Формат преобразования Unicode — 8 бит». Нам это пока не поможет, поэтому давайте вернемся к основам.

Двоичный файл: как компьютеры хранят информацию

Для хранения информации компьютеры используют двоичную систему.В двоичном формате все данные представлены в виде последовательностей 1 и 0. Основной единицей двоичного кода является бит, представляющий собой одну единицу или 0. Следующая по величине единица двоичного кода, байт, состоит из 8 бит. Пример байта: «01101011».

Каждый цифровой объект, с которым вы когда-либо сталкивались, — от программного обеспечения до мобильных приложений, веб-сайтов и историй в Instagram — построен на этой системе байтов, которые связаны друг с другом таким образом, который имеет смысл для компьютеров. Когда мы говорим о размерах файлов, мы имеем в виду количество байтов. Например, килобайт — это примерно тысяча байтов, а гигабайт — примерно миллиард байтов.

Текст — это один из многих ресурсов, которые хранятся и обрабатываются компьютерами. Текст состоит из отдельных символов, каждый из которых представлен в компьютере строкой битов. Эти строки объединяются в цифровые слова, предложения, абзацы, любовные романы и т. д.

ASCII: преобразование символов в двоичные

Американский стандартный код для обмена информацией (ASCII) был ранней стандартизированной системой кодирования текста. Кодирование — это процесс преобразования символов человеческого языка в двоичные последовательности, которые могут обрабатываться компьютером.

Библиотека ASCII включает все прописные и строчные буквы латинского алфавита (A, B, C...), все цифры от 0 до 9 и некоторые распространенные символы (такие как /, ! и ?). Каждому из этих символов присваивается уникальный трехзначный код и уникальный байт.

В таблице ниже показаны примеры символов ASCII с соответствующими кодами и байтами.

Точно так же, как символы объединяются в слова и предложения в языке, двоичный код делает то же самое в текстовых файлах. Итак, предложение «Быстрая коричневая лиса перепрыгивает через ленивую собаку». представленный в двоичном формате ASCII, будет:

Это мало что значит для нас, людей, но для компьютера это хлеб с маслом.

Количество символов, которые может представлять ASCII, ограничено количеством доступных уникальных байтов, поскольку каждый символ получает один байт. Если вы посчитаете, то обнаружите, что существует 256 различных способов сгруппировать восемь единиц и нулей вместе. Это дает нам 256 различных байтов или 256 способов представления символа в ASCII. Когда в 1960 году была введена ASCII, это было нормально, поскольку разработчикам требовалось всего 128 байт для представления всех нужных им английских букв и символов.

Но по мере глобального распространения вычислительной техники компьютерные системы стали хранить текст на других языках, помимо английского, многие из которых использовали символы, отличные от ASCII. Были созданы новые системы для сопоставления других языков с одним и тем же набором из 256 уникальных байтов, но наличие нескольких систем кодирования было неэффективным и запутанным. Разработчикам требовался лучший способ кодирования всех возможных символов в одной системе.

Юникод: способ хранения всех символов

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

Юникод теперь является универсальным стандартом для кодирования всех человеческих языков. И да, он даже включает смайлики.

Ниже приведены некоторые примеры текстовых символов и соответствующие им кодовые точки. Каждая кодовая точка начинается с «U» для «Unicode», за которой следует уникальная строка символов для представления символа.

Если вы хотите узнать, как генерируются кодовые точки и что они означают в Unicode, ознакомьтесь с этим подробным объяснением.

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

Однако Unicode сам по себе не хранит слова в двоичном формате. Компьютерам нужен способ перевода Unicode в двоичный код, чтобы его символы можно было хранить в текстовых файлах. Здесь на помощь приходит кодировка UTF-8.

UTF-8: последняя часть головоломки

UTF-8 – это система кодирования Unicode. Он может преобразовать любой символ Unicode в соответствующую уникальную двоичную строку, а также может преобразовать двоичную строку обратно в символ Unicode. В этом смысл «UTF» или «формата преобразования Unicode».

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

В частности, UTF-8 преобразует кодовую точку (которая представляет один символ в Unicode) в набор от одного до четырех байтов. Первые 256 символов в библиотеке Unicode, включая символы, которые мы видели в ASCII, представлены как один байт. Символы, которые появляются позже в библиотеке Unicode, кодируются как двухбайтовые, трехбайтовые и, возможно, четырехбайтовые двоичные единицы.

Ниже приведена та же таблица символов, что и выше, с выводом UTF-8 для каждого добавленного символа.Обратите внимание, что некоторые символы представлены одним байтом, в то время как другие используют больше.

Почему UTF-8 преобразовывает одни символы в один байт, а другие — в четыре байта? Короче, для экономии памяти. Используя меньше места для представления более распространенных символов (например, символов ASCII), UTF-8 уменьшает размер файла, позволяя использовать гораздо большее количество менее распространенных символов. Эти менее распространенные символы закодированы в два или более байта, но это нормально, если они хранятся экономно.

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

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

Символы UTF-8 в веб-разработке

UTF-8 – это наиболее распространенный метод кодировки символов, используемый сегодня в Интернете, а также набор символов по умолчанию для HTML5. Более 95% всех веб-сайтов, включая ваш собственный, хранят символы таким образом. Кроме того, распространенные методы передачи данных через Интернет, такие как XML и JSON, кодируются в соответствии со стандартами UTF-8.

Поскольку теперь это стандартный метод кодирования текста в Интернете, все страницы вашего сайта и базы данных должны использовать кодировку UTF-8. Система управления контентом или конструктор веб-сайтов по умолчанию сохраняют ваши файлы в формате UTF-8, но все же рекомендуется убедиться, что вы придерживаетесь этой рекомендации.

Текстовые файлы, закодированные с помощью UTF-8, должны указывать это программному обеспечению, которое их обрабатывает. В противном случае программное обеспечение не сможет правильно преобразовать двоичный файл обратно в символы. В файлах HTML вы можете увидеть строку кода, подобную следующей, вверху:

Это сообщает браузеру, что HTML-файл закодирован в UTF-8, чтобы браузер мог преобразовать его обратно в разборчивый текст.

UTF-8 и UTF-16

Как я уже упоминал, UTF-8 — не единственный метод кодирования символов Unicode. Существует также UTF-16. Эти методы различаются количеством байтов, необходимых для хранения символа. UTF-8 кодирует символ в двоичную строку из одного, двух, трех или четырех байтов. UTF-16 кодирует символ Юникода в строку из двух или четырех байтов.

Это различие очевидно из их имен. В UTF-8 наименьшее двоичное представление символа составляет один байт или восемь бит. В UTF-16 наименьшее двоичное представление символа составляет два байта или шестнадцать бит.

И UTF-8, и UTF-16 могут преобразовывать символы Unicode в двоичные файлы, удобные для компьютера, и обратно. Однако они не совместимы друг с другом. Эти системы используют разные алгоритмы для преобразования кодовых точек в двоичные строки, поэтому двоичный вывод для любого заданного символа будет выглядеть по-разному при использовании обоих методов:

Кодировка UTF-8 предпочтительнее UTF-16 на большинстве веб-сайтов, поскольку она использует меньше памяти. Напомним, что UTF-8 кодирует каждый символ ASCII всего одним байтом. UTF-16 должен кодировать эти же символы двумя или четырьмя байтами. Это означает, что текстовый файл на английском языке, закодированный с помощью UTF-16, будет как минимум вдвое больше, чем тот же файл, закодированный с помощью UTF-8.

UTF-16 эффективнее, чем UTF-8, только на некоторых веб-сайтах, отличных от английского. Если веб-сайт использует язык с более ранними символами в библиотеке Unicode, UTF-8 будет кодировать все символы как четыре байта, тогда как UTF-16 может кодировать многие из тех же символов только как два байта. Тем не менее, если ваши страницы заполнены буквами ABC и 123, придерживайтесь UTF-8.

Расшифровка мира кодировки UTF-8

Это было много слов о словах, так что давайте подытожим то, что мы рассмотрели:

  1. Компьютеры хранят данные, включая текстовые символы, в двоичном формате (1 и 0).
  2. ASCII был одним из первых способов кодирования или преобразования символов в двоичный код, чтобы компьютеры могли их хранить. Однако в ASCII недостаточно места для представления нелатинских символов и чисел в двоичном формате.
  3. Решением этой проблемы стал Unicode. Unicode присваивает уникальный «код» каждому символу в любом человеческом языке.
  4. UTF-8 — это метод кодировки символов Unicode. Это означает, что UTF-8 берет кодовую точку для данного символа Unicode и переводит ее в двоичную строку. Он также делает обратное, читая двоичные цифры и преобразовывая их обратно в символы.
  5. В настоящее время UTF-8 является самым популярным методом кодирования в Интернете, поскольку он может эффективно хранить текст, содержащий любой символ.
  6. UTF-16 — это еще один метод кодирования, но он менее эффективен для хранения текстовых файлов (за исключением тех, которые написаны на некоторых языках, отличных от английского).

Перевод Unicode — это не то, о чем большинству из нас нужно думать при просмотре или разработке веб-сайтов, и именно в этом суть — создать единую систему обработки текста, которая работает для всех языков и веб-браузеров. Если он работает хорошо, вы этого не заметите.

Но если вы обнаружите, что страницы вашего веб-сайта занимают слишком много места или если ваш текст замусорен символами ▢s и �s, пришло время применить ваши новые знания UTF-8 на практике.

Читайте также: