Каков стандарт кодирования текста в памяти компьютера
Обновлено: 21.11.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), если бы хотели быть технически правильными — именно так компьютер действительно работает с вещами.
Итак, вы можете подумать, что текст — это просто текст. Ну, подумайте еще раз. В этой серии статей мы спустимся на уровень байтов, изучим, как текст на самом деле представлен компьютерами, и обсудим, как это влияет на ваши интеграционные решения.
Что такое кодировка?
Кодирование — это способ, которым компьютер сохраняет текст в виде необработанных двоичных данных. Чтобы правильно читать текстовые данные, вы должны знать, какая кодировка использовалась для их хранения, а затем использовать ту же кодировку для интерпретации двоичных данных, чтобы получить исходный текст. Теперь вы, вероятно, думаете: «Звучит не так уж и плохо, ведь существует всего пара разных кодировок, и наверняка все текстовые данные содержат информацию о том, какая кодировка используется, верно?» Что ж, ответы на эти вопросы, к сожалению, не так просты, поэтому кодирование может стать таким кошмаром для разработчиков.
Что такое текст?
Что такое текст на самом деле, зависит от контекста. При хранении или передаче текст представляет собой просто фрагмент двоичных данных, как и любой другой тип данных. На самом базовом уровне это длинный ряд нулей и единиц. Когда он активно обрабатывается компьютером, это все еще двоичные данные, но они интерпретируются системой как отдельные символы и во многих случаях преобразуются в другое двоичное представление во время обработки. Это представление называется Unicode.
Краткое введение в Юникод
В 1988 году цифровая обработка данных становилась все более распространенной, но рынок по-прежнему оставался крайне фрагментированным, и каждый поставщик использовал собственные нестандартные решения для большинства задач. В результате взаимной совместимости между различными компьютерными системами практически не существовало, а передача данных из одной системы в другую часто была очень сложной задачей. В это время была предпринята попытка остановить поток возникающих проблем с кодировкой путем введения стандартизированного общего набора символов, известного как Unicode. Таким образом, все различные используемые кодировки можно было бы, по крайней мере, сопоставить с общим набором символов, чтобы не было никаких сомнений относительно того, какой символ должен представлять данный код.
«Юникод – это отраслевой стандарт компьютерной техники для единообразного кодирования, представления и обработки текста, выраженного в большинстве систем письменности мира. Стандарт поддерживается Консорциумом Unicode, и по состоянию на май 2019 г. самая последняя версия Unicode 12.1 содержит репертуар из 137 994 символов, охватывающих 150 современных и исторических шрифтов, а также несколько наборов символов и эмодзи. р>
При обработке текста Unicode берет на себя роль предоставления уникальной кодовой точки — числа, а не глифа — для каждого символа.Другими словами, Unicode представляет символ абстрактным образом и оставляет визуальное представление (размер, форму, шрифт или стиль) другому программному обеспечению, такому как веб-браузер или текстовый процессор».
Набор символов Unicode сам по себе не является кодировкой, а представляет собой просто стандартизированный набор всех символов, которые могут встретиться в файле данных. Стандарт Unicode также содержит ряд фактических кодировок. Общим для всех них, в отличие от большинства других форм кодирования текста, является то, что они поддерживают весь набор символов Unicode.
Хотя Unicode решил некоторые проблемы, связанные с избытком сосуществующих кодировок символов, он не решил их всех. Во-первых, внедрение сопутствующих систем кодирования было медленным и до сих пор далеко не универсальным. С другой стороны, несмотря на то, что наличие общего набора символов для сопоставления кодировок было, безусловно, полезным, это не изменило того досадного факта, что многие типы текстовых данных не содержат никакой информации о том, какая система кодирования использовалась для их создания.
Итак, как работает кодирование?
Хорошо, давайте перейдем к мельчайшим деталям. Что на самом деле сохраняется при сохранении текстового файла? Во-первых, мы рассмотрим одну из самых старых и простых кодировок — ASCII. Вот выдержка из статьи Википедии для ASCII:
«Первоначально основанный на английском алфавите, ASCII кодирует 128 указанных символов в семибитные целые числа, как показано на приведенной выше диаграмме ASCII. Печатаются 95 закодированных символов: они включают цифры от 0 до 9, строчные буквы от a до z, прописные буквы от A до Z и знаки препинания. Кроме того, исходная спецификация ASCII включала 33 непечатаемых управляющих кода, созданных телетайпами; большинство из них сейчас устарели, хотя некоторые из них все еще широко используются, например возврат каретки, перевод строки и коды табуляции».
Поскольку ASCII был разработан в США и основан на английском алфавите, он содержит только стандартные английские символы. Это означает, что текст, содержащий неанглийские символы (например, буквы с акцентом или специальные буквы, используемые в других языках), не может быть точно закодирован в ASCII без замены специальных символов на стандартные английские. ASCII был разработан с использованием 7-битных кодов для представления закодированных им символов, но поскольку все современные компьютеры используют байты (8 бит) в качестве наименьшей единицы памяти, символы ASCII теперь хранятся с использованием 8 бит на символ. Первый бит просто не используется.
Весь стандарт кодирования ASCII выглядит следующим образом:
Теперь давайте рассмотрим пример, чтобы увидеть, как эти тексты будут закодированы в стандарте ASCII. Вместо полного двоичного представления более длинных текстов мы будем использовать шестнадцатеричное представление для двоичных данных.
Когда вы открываете текстовый файл с кодировкой ASCII в текстовом редакторе, программа считывает каждый байт файла и ищет значение в таблице ASCII, чтобы определить, какой символ отображать для этого байта.
Однако кодировка ASCII очень ограничена. Он содержит только 95 печатных символов и поэтому может использоваться только для кодирования этих символов. Если у вас есть текстовые данные, содержащие больше символов, чем эти 95 печатных символов, вам придется использовать другую кодировку.
Это основы работы кодирования. В следующей части серии мы рассмотрим несколько различных кодировок и их отличия друг от друга, которые вы можете найти здесь: Кодировка 101 — Часть 2.
Однако сегодня, работая с сетевыми протоколами и сетевым программированием, вы столкнетесь с множеством схем кодирования данных и символов.
В этом руководстве мы рассмотрим основные схемы кодирования, используемые на компьютерах, а во второй части руководства мы рассмотрим, как данные передаются по сети.
Символы, целые числа, числа с плавающей точкой и т. д.
При хранении и передаче данных вам необходимо будет представлять следующие типы данных:
- Символы и цифры, например A и 1
- Длинные (32 бита) и короткие (16 бит) целые числа со знаком и без знака
- Одинарное и двойное число с плавающей запятой
- Логическое значение, т. е. True и False
Так как же компьютер запоминает букву А или цифру 1?
Как компьютер запоминает число вроде 60101? или 62.0101?
Как передать букву А и т. д. на другой компьютер по сети?
Компьютеры и кодировка символов
Чтобы сохранить текст в виде двоичных данных, необходимо указать кодировку для этого текста.
Компьютерные системы могут использовать различные схемы кодирования символов.
Пока данные остаются на компьютере, совершенно неважно, как они закодированы.
Однако для передачи данных между системами необходимо использовать стандартную схему кодирования.
В 1968 году ASCII (Американский стандартный код для обмена информацией) был принят в качестве стандарта кодирования текста для обмена данными.
ASCII
ASCII – это американский стандарт, разработанный для кодирования английских символов и знаков препинания, которые использовались на пишущих машинках и телетайпах того времени (1960-е годы).
ASCII использует 8 бит, хотя на самом деле используется только 7 бит.
Поскольку кодировка ASCII была разработана во время эксплуатации устройств телетайпа, она также содержит управляющие коды, предназначенные для управления устройством телетайпа.
В таблице ниже представлены сводные данные о распределении кодов.
Таблица ASCII – сводка кодов
Расширения ASCII
Поскольку ASCII не может кодировать такие символы, как знак фунта £ или распространенные символы немецкого и других европейских языков, были разработаны различные расширения.
Эти расширения сохранили набор символов ASCII и использовали неиспользуемую часть адресного пространства и управляющие коды для дополнительных символов.
Наиболее распространенными являются Windows 1252 и Latin-1 (ISO-8859).
Windows 1252 и 7-битная кодировка ASCII были наиболее широко используемыми схемами кодирования до 2008 года, когда UTF-8 стал наиболее распространенным.
ISO-8859-1,ISO-8859-15, Latin-1
ISO-8859 — это 8-битная кодировка символов, которая расширяет 7-битную схему кодирования ASCII и используется для кодирования большинства европейских языков. Подробнее см. вики.
ISO-8859-1, также известный как Latin-1, является наиболее широко используемым, поскольку его можно использовать для большинства распространенных европейских языков, например немецкого, итальянского, испанского, французского и т. д.
Она очень похожа на схему кодирования Windows-1252, но не идентична, см. Сравнение символов в Windows-1252, ISO-8859-1, ISO-8859-15
Юникод
В связи с необходимостью кодирования символов иностранных языков и других графических символов был разработан набор символов Unicode и схемы кодирования.
Самые распространенные схемы кодирования:
UTF-8 – это наиболее часто используемая схема кодирования, используемая в современных компьютерных системах и компьютерных сетях.
Это схема кодирования переменной ширины, разработанная для полной обратной совместимости с ASCII. Он использует от 1 до 4 байт. – вики
Наборы символов и схемы кодирования
Разница между ними не всегда ясна, и термины, как правило, используются взаимозаменяемо.
Набор символов — это список символов, а схема кодирования — это то, как они представлены в двоичном формате.
Это лучше всего видно с Unicode.
Схемы кодирования UTF-8, UTF-16 и UTF-32 используют набор символов Unicode, но кодируют символы по-разному.
ASCII – это набор символов и схема кодирования.
Знак порядка байтов (BOM)
Знак порядка байтов (BOM) — это символ Unicode, U+FEFF, который появляется как магическое число в начале текстового потока и может сигнализировать программе, потребляющей текст, о нескольких вещах: –Wiki
- Порядок байтов или порядок следования байтов в текстовом потоке;
- Тот факт, что кодировка текстового потока — Unicode, с высокой степенью достоверности;
- Какой Unicode кодирует текстовый поток.
Спецификация различается для текста в кодировке UTF-8, UTF-16 и UTF-32
Следующая таблица, взятая из Wiki, показывает это.
Спецификации и текстовые редакторы
Как правило, большинство редакторов правильно обрабатывают спецификацию, и она не отображается.
Программное обеспечение Microsoft, такое как Блокнот, добавляет спецификацию при сохранении данных в кодировке UTF-8 и не может интерпретировать текст без спецификации, если он не является чистым ASCII.
Пример спецификации
Ниже приведен вывод простой программы на Python, которая отображает содержимое файла, содержащего символы TEST (4 символа), сохраненные в виде ASCII, UTF-8, UTF-16-BE и UTF-16-LE
Распространенные вопросы и ответы
В. Как узнать, какую кодировку символов использует файл?
A- Обычно это не так, но некоторые текстовые редакторы, такие как notepad++, отображают кодировку. Если вы получили файл, закодированный с помощью кодировки, отличной от ожидаемой, вы можете получить сообщение об ошибке при попытке его чтения.
В. Мой файл в формате ASCII, но он нормально декодируется с помощью декодера UTF-8. Почему?
A- Потому что UTF-8 обратно совместим с ASCII.
Целые числа и числа с плавающей запятой — Big и Little Endian
Примечание. Поскольку в кодировках UTF-16 и UTF-32 используются 2-байтовые или 4-байтовые целые числа, к кодированию текста с их использованием применяется следующее
Количество байтов, выделенных для целого числа или числа с плавающей запятой, зависит от системы.
Пункт Tutorials описывает это для языка программирования C, и я буду использовать его для иллюстрации
Если мы возьмем короткое целое как 2 байта, а длинное целое как 4 байта.
Поскольку они используют несколько байтов, возникает несколько вопросов:
- Какой байт представляет старшую часть числа?
- При сохранении в памяти, какой байт сохраняется первым
- При отправке по сети какой байт отправляется первым.
Окончание байтов относится к последовательному порядку, в котором байты упорядочиваются в более крупные числовые значения при сохранении в памяти или при передаче по цифровым каналам связи.
Окончание байтов представляет интерес в информатике, потому что два конфликтующих и несовместимых формата широко используются: слова могут быть представлены в формате с прямым порядком байтов или прямым порядком байтов, в зависимости от того, упорядочены ли биты, байты или другие компоненты от большого конец (самый значащий бит) или маленький конец (наименьший значащий бит).
В формате с обратным порядком байтов всякий раз, когда адресуется память или отправляются/сохраняются слова побайтно, старший значащий байт — байт, содержащий старший значащий бит — сохраняется сначала (имеет младший адрес) или отправляется первым, затем следующие байты сохраняются или отправляются в порядке убывания значимости, причем младший байт — тот, который содержит младший значащий бит — сохраняется последним (имеет самый высокий адрес) или отправляется последним.Вики
На приведенном ниже рисунке с использованием python показано целое число 16, представленное в виде 4 байтов, с использованием порядка байтов с прямым и обратным порядком байтов.
Сетевой порядок байтов и системный порядок байтов
Сетевой порядок байтов – это порядок расположения байтов при отправке данных по сети. ( TCP/IP обычно имеет формат Big Endian ).
Это означает, что старший байт отправляется первым.
Системный порядок байтов или порядок байтов хоста — это способ размещения байтов при сохранении в памяти хост-системы.
Целевая аудитория: авторы контента, пользователи и все, кто не знает, что такое кодировка символов, и хочет получить краткую информацию о том, как она на них влияет.
Вопрос
Что такое кодировка символов и зачем мне это?
Ответить
Во-первых, какое мне дело?
Если вы используете какой-либо другой текст, кроме самого простого английского текста, люди могут не прочитать созданный вами контент, пока вы не скажете, какую кодировку символов вы использовали.
Например, вы можете сделать так, чтобы текст выглядел так:
но на самом деле это может выглядеть так:
Отсутствие информации о кодировке символов не только ухудшает читаемость отображаемого текста, но и может означать, что ваши данные не могут быть найдены поисковой системой или надежно обработаны машинами рядом других способов.
Так что же такое кодировка символов?
Слова и предложения в тексте создаются из файлов . Примеры символов включают латинскую букву á, китайскую иероглифику 請 или иероглиф деванагари ह .
Возможно, вы не сможете увидеть некоторые символы на этой странице, потому что у вас нет необходимых шрифтов. Если вы нажмете на то место, где вы ожидали увидеть символ, вы перейдете к графической версии. Эта страница закодирована в UTF-8.
Символы, необходимые для определенной цели, группируются в (также называемые ). (Для однозначного обращения к символам каждый символ связан с числом, называемым .)
Символы хранятся в компьютере как один или несколько .
В принципе, вы можете визуализировать это, предположив, что все символы хранятся в компьютерах с использованием специального кода, подобного шифрам, используемым в шпионаже. A предоставляет ключ для разблокировки (т.е. взлома) кода. Это набор сопоставлений между байтами в компьютере и символами в наборе символов. Без ключа данные выглядят как мусор.
Этот вводящий в заблуждение термин часто используется для обозначения того, что на самом деле является кодировкой символов. Вы должны знать об этом использовании, но по возможности придерживайтесь термина кодировки символов.
Таким образом, когда вы вводите текст с помощью клавиатуры или каким-либо другим способом, кодировка символов сопоставляет выбранные вами символы с определенными байтами в памяти компьютера, а затем для отображения текста считывает байты обратно в символы.
К сожалению, существует множество различных наборов символов и кодировок, т.е. множество различных способов отображения между байтами, кодовыми точками и символами. В разделе «Дополнительная информация» для тех, кто интересуется, немного больше подробностей.
Однако в большинстве случаев вам не нужно знать подробности. Вам просто нужно быть уверенным, что вы прислушаетесь к советам в разделе Как это на меня повлияет? ниже.
Как в это вписываются шрифты?
A — это набор определений глифов, т.е. определения фигур, используемых для отображения символов.
После того как ваш браузер или приложение определит, с какими символами он имеет дело, он будет искать в шрифте глифы, которые можно использовать для отображения или печати этих символов. (Конечно, если информация о кодировке была неверной, она будет искать глифы для неправильных символов.)
Заданный шрифт обычно охватывает один набор символов или, в случае большого набора символов, такого как Unicode, только подмножество всех символов в наборе. Если в вашем шрифте нет глифа для определенного символа, некоторые браузеры или программные приложения будут искать отсутствующие глифы в других шрифтах в вашей системе (это будет означать, что глиф будет отличаться от окружающего текста, например, примечание о выкупе). ). В противном случае вы обычно увидите квадратную рамку, вопросительный знак или какой-либо другой символ. Например:
Как это влияет на меня?
В настоящее время как автор или разработчик контента вы всегда должны выбирать кодировку символов UTF-8 для своего контента или данных. Эта кодировка Unicode является хорошим выбором, потому что вы можете использовать кодировку одного символа для обработки любого символа, который вам может понадобиться. Это сильно упрощает дело. Использование Unicode во всей вашей системе также избавляет от необходимости отслеживать и преобразовывать различные кодировки символов.
Авторам контента необходимо выяснить, как объявить кодировку символов, используемую для формата документа, с которым они работают.
Обратите внимание, что простое объявление другой кодировки на вашей странице не изменит байты; вам также нужно сохранить текст в этой кодировке.
Разработчикам необходимо убедиться, что различные части системы могут взаимодействовать друг с другом, понимать, какие кодировки символов используются, и поддерживать все необходимые кодировки и символы. (В идеале вы должны использовать кодировку UTF-8 везде и избавитесь от этой проблемы.)
По приведенным ниже ссылкам можно найти дополнительную информацию по этим темам.
Дополнительная информация
В этом разделе содержится небольшая дополнительная информация о сопоставлении между байтами, кодовыми точками и символами для тех, кому это интересно. Не стесняйтесь просто перейти к разделу «Дополнительная литература».
Обратите внимание, что числа кодовых точек обычно выражаются в шестнадцатеричной системе счисления, т.е. основание 16. Например, 233 в шестнадцатеричной форме равно E9. Значения кодовой точки Unicode обычно записываются в форме U+00E9.
В наборе кодированных символов ISO 8859-1 (также известном как Latin1) значение десятичного кода для буквы é равно 233. Однако в ISO 8859-5 та же самая кодовая точка представляет кириллический символ щ .
Эти наборы символов содержат менее 256 символов и напрямую сопоставляют кодовые точки со значениями байтов, поэтому кодовая точка со значением 233 представлена одним байтом со значением 233. Обратите внимание, что только контекст определяет, будет ли этот байт представляет либо é, либо sch .
Есть и другие способы обработки символов из ряда сценариев. Например, с помощью набора символов Unicode вы можете представлять оба символа в одном наборе. На самом деле Unicode содержит в одном наборе, вероятно, все символы, которые вам когда-либо понадобятся. В то время как буква é по-прежнему представлена кодовой точкой 233, кириллический символ щ теперь имеет кодовую точку 1097.
В наши дни байты обычно состоят из 8 бит. Существует только 2 8 (т.е. 256) уникальных способов объединения 8 битов.
С другой стороны, 1097 — слишком большое число, чтобы его можно было представить одним байтом*. Итак, если вы используете кодировку символов для текста Unicode, называемую UTF-8, щ будет представлена двумя байтами. Однако значение кодовой точки получается не просто из значения двух соединенных вместе байтов — требуется более сложное декодирование.
Другие символы Юникода соответствуют одному, трем или четырем байтам в кодировке UTF-8.
Кроме того, обратите внимание, что буква é также представлена двумя байтами в UTF-8, а не одним байтом, который используется в ISO 8859-1. (Только символы ASCII кодируются одним байтом в UTF-8.)
UTF-8 — это наиболее широко используемый способ представления текста Unicode на веб-страницах, и вы всегда должны использовать UTF-8 при создании своих веб-страниц и баз данных. Но, в принципе, UTF-8 — это лишь один из возможных способов кодировки символов Юникода. Другими словами, одна кодовая точка в наборе символов Unicode может фактически отображаться в различные последовательности байтов, в зависимости от того, какая кодировка использовалась для документа. Кодовые точки Unicode могут быть сопоставлены с байтами с использованием любой из кодировок, называемых UTF-8, UTF-16 или UTF-32. Символ деванагари क с кодовой точкой 2325 (что равно 915 в шестнадцатеричной записи) будет представлен двумя байтами при использовании кодировки UTF-16 (09 15), тремя байтами при использовании UTF-8 (E0 A4 95) или четырьмя байтами. байт с кодировкой UTF-32 (00 00 09 15).
Могут быть дополнительные сложности помимо описанных в этом разделе (например, порядок байтов и escape-последовательности), но описанные здесь подробности показывают, почему важно, чтобы приложение, с которым вы работаете, знало, какая кодировка символов подходит для ваших данных. , и знает, как обращаться с этой кодировкой.
Дополнительная литература
Начинаете? Введение в наборы символов и кодировки — указывает на другие документы W3C, связанные с наборами символов и кодировками
Учебное пособие, Работа с кодировками символов в HTML и CSS. Советы по выбору кодировки, ее объявлению и другим темам, связанным с HTML и CSS.
Настройка кодировки в веб-приложениях для разработки — как заставить ваш редактор сохранять в другой кодировке список сред редактирования.
Читайте также: