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

Обновлено: 21.11.2024

Однако сегодня, работая с сетевыми протоколами и сетевым программированием, вы столкнетесь с множеством схем кодирования данных и символов.

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

Символы, целые числа, числа с плавающей точкой и т. д.

При хранении и передаче данных вам необходимо будет представлять следующие типы данных:

  • Символы и цифры, например 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 ).

Это означает, что старший байт отправляется первым.

Системный порядок байтов или порядок байтов хоста — это способ размещения байтов при сохранении в памяти хост-системы.

Понимание Unicode и кодировок символов

Введение: весь открытый текст представлен в виде байтов (целых чисел)

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

Большая часть данных, с которыми мы работаем, хранится в файлах с открытым текстом, которые представляют собой просто потоки символов. Типы файлов с открытым текстом включают .txt, .csv, .json, .html и .xml . Однако в наших компьютерных системах все файлы хранятся в двоичном виде. Файлы с открытым текстом хранятся в виде целых чисел, где каждое целое число (иногда 2–4 целых числа) представляет символ.

Каждое целое число занимает в нашей системе байт, поэтому строки целых чисел, представляющие символы, называются байтовыми строками. Чтобы просмотреть текст в приложении (например, в текстовом редакторе, браузере, Python и т. д.), целые числа в строке байтов должны быть преобразованы в символы. Для этого приложение должно ссылаться на кодировку, указывающую целочисленное значение, соответствующее каждому символу в наборе символов. Каждый раз, когда мы смотрим на текст, будь то в редакторе, IDE, браузере или программе Python, строки байтов преобразуются в текст. Это происходит незаметно и плавно (хотя иногда вы можете увидеть знак ? в чате или на веб-странице — это означает, что конвертер не знал, как преобразовать это целое число).

Таблица ASCII: исходный набор символов

Исходный набор символов, впервые использованный на компьютерах, известен как таблица ascii. Если вы посмотрите на эту таблицу и выберете целые эквиваленты для «привет, мир!» вы увидите, что они совпадают с предыдущими привет, мир! пример.

Вы также можете увидеть аналогичный перевод в действии, используя функции ord() и chr():

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

Юникод: попытка создать универсальный набор символов

Существует много наборов символов; UTF-8 – наиболее распространенная кодировка Unicode.

Юникод в Python: кодирование и декодирование строк байтов

Строка – это последовательность символов; строка байтов — это последовательность целых чисел, представляющих каждый символ, отображаемый посредством кодировки .

Как мы уже говорили, весь текст хранится в виде целочисленных значений, каждое целое число представляет символ. При отображении текста целые числа должны быть преобразованы в символы. Это означает, что каждый раз, когда вы видите символы, представленные в файле — в редакторе, браузере или программе Python — эти символы были декодированы из целочисленных значений. Чтобы декодировать целое число в соответствующий символ, приложение должно обратиться к кодировке, которая отображает целочисленные значения в символы. ascii — одна из таких кодировок, utf-8 — другая. Это означает, что каждое строковое представление текста, которое вы видите, было декодировано из целых чисел с использованием кодировки.

Чтобы Python кодировал строку в целочисленную строку байтов, мы используем метод str.encode():

Строка байтов обозначается буквой b'' . Он печатает со строковыми символами, потому что Python по умолчанию применяет кодировку utf-8.

Чтобы декодировать строку байтов в строку, мы используем метод bytes.decode(), предоставляющий кодировку:

Большинство современных приложений, таких как Python, по умолчанию используют utf-8. Если мы хотим открыть файл с другой кодировкой, мы можем указать это в open() :

Мы также можем открыть файл для чтения как байты с аргументом rb:

И мы также можем записывать необработанные байты в файл:

Обработка ошибок декодирования и кодирования

Мы можем перехватывать ошибки декодирования и кодирования и/или удалять или заменять недопустимые символы.

Строки и строки байтов не содержат информации о кодировке; это означает, что даже они не «знают», какую кодировку они используют, и поэтому не могут сказать нам, какую кодировку использовать.

Итак, мы можем получить текст, который неправильно кодируем или декодируем:

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

Если мы обнаружим, что строка не может быть декодирована в указанную кодировку, мы можем либо удалить, либо заменить неизвестный символ:

'replace' создает только буквальный вопросительный знак для замены неизвестного символа; «игнорировать» удаляет его «прослушивание» кодировки строки байтов. Строка байтов не содержит метаинформации, поэтому она «не знает», какая кодировка использовалась для ее создания.

Python предоставляет модуль chardet, который может проверять строку байтов, чтобы определить ее кодировку. Мы называем этот вид доказательной экспертизы «обнюхиванием»:

Вероятно, вы знаете, что все на компьютере хранится в виде строк битов (двоичных цифр; вы можете думать о них как о множестве маленьких переключателей). Здесь мы объясним, как эти биты используются для представления букв и цифр, которые обрабатывает ваш компьютер.

Прежде чем мы приступим к этому, вам нужно понять размер слова вашего компьютера. Размер слова является предпочтительным размером компьютера для перемещения единиц информации; технически это ширина регистров вашего процессора, которые являются областями хранения, которые ваш процессор использует для выполнения арифметических и логических вычислений. Когда люди пишут о компьютерах с разрядностью (называя их, скажем, «32-битными» или «64-битными»), они имеют в виду именно это.

Большинство компьютеров теперь имеют размер слова 64 бита. В недавнем прошлом (начало 2000-х) многие ПК имели 32-битные слова. Старые машины 286 в 1980-х годах имели размер слова 16. В старых мейнфреймах часто использовались 36-битные слова.

Компьютер рассматривает вашу память как последовательность слов, пронумерованных от нуля до некоторого большого значения, зависящего от объема вашей памяти. Это значение ограничено размером вашего слова, поэтому программы на старых машинах, таких как 286, должны были пройти через болезненные искажения, чтобы адресовать большие объемы памяти. Я не буду описывать их здесь; они до сих пор вызывают кошмары у программистов постарше.

Целые числа представлены в виде слов или пар слов, в зависимости от размера слова вашего процессора. Одно 64-битное машинное слово является наиболее распространенным целочисленным представлением.

Целая арифметика близка к математической системе счисления по основанию два, но не совсем ей. Младший бит равен 1, затем 2, затем 4 и так далее, как в чистом двоичном коде. Но числа со знаком представлены в записи с дополнением до двух. Бит старшего разряда — это бит знака, который делает величину отрицательной, и каждое отрицательное число может быть получено из соответствующего положительного значения путем инвертирования всех битов и добавления единицы. Вот почему целые числа на 64-битной машине имеют диапазон от -2 63 до 2 63 - 1.Этот 64-й бит используется для знака; 0 означает положительное число или ноль, 1 — отрицательное число.

Некоторые компьютерные языки предоставляют вам доступ к беззнаковым арифметическим операциям, которые представляют собой прямое основание 2 только с нулями и положительными числами.

Большинство процессоров и некоторые языки могут выполнять операции с числами с плавающей запятой (эта возможность встроена во все современные чипы процессоров). Числа с плавающей запятой дают гораздо более широкий диапазон значений, чем целые числа, и позволяют выражать дроби. Способы, которыми это делается, различны и слишком сложны, чтобы подробно обсуждать их здесь, но общая идея очень похожа на так называемую «научную нотацию», где можно записать, скажем, 1,234 * 10 23 ; кодирование числа разделено на мантисса (1,234) и экспоненциальную часть (23) для множителя степени десяти (что означает, что умноженное число будет иметь 20 нулей, 23 минус три десятичных знака).

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

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

Было несколько попыток решить эту проблему. Все они используют дополнительный старший бит, которого нет в ASCII, что делает его младшей половиной набора из 256 символов. Наиболее широко используемым из них является так называемый набор символов «Latin-1» (более формально называемый ISO 8859-1). Это набор символов по умолчанию для Linux, старых версий HTML и X. Microsoft Windows использует измененную версию Latin-1, которая добавляет набор символов, таких как правые и левые двойные кавычки, в тех местах, где правильный Latin-1 оставляет неназначенными для исторических данных. причинам (обзорный отчет о проблемах, которые это вызывает, см. на странице деморонизатора).

Latin-1 поддерживает западноевропейские языки, включая английский, французский, немецкий, испанский, итальянский, голландский, норвежский, шведский, датский и исландский. Однако этого тоже недостаточно, и в результате существует целая серия наборов символов от латиницы от 2 до -9 для обработки таких вещей, как греческий, арабский, иврит, эсперанто и сербско-хорватский. Подробности см. на странице супа с алфавитом ISO.

Наилучшее решение — огромный стандарт Unicode (и его аналог ISO/IEC 10646-1:1993). Unicode идентичен Latin-1 в самых нижних 256 слотах. Над ними в 16-битном пространстве он включает греческий, кириллический, армянский, иврит, арабский, деванагари, бенгальский, гурмукхи, гуджарати, ория, тамильский, телугу, каннада, малаялам, тайский, лаосский, грузинский, тибетский, японский Кана, полный набор современных корейских хангыль и единый набор китайских/японских/корейских (CJK) иероглифов. Дополнительные сведения см. на домашней странице Unicode. XML и XHTML используют этот набор символов.

Понимание Unicode и кодировок символов

Введение: весь открытый текст представлен в виде байтов (целых чисел)

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

Большая часть данных, с которыми мы работаем, хранится в файлах с открытым текстом, которые представляют собой просто потоки символов. Типы файлов с открытым текстом включают .txt, .csv, .json, .html и .xml . Однако в наших компьютерных системах все файлы хранятся в двоичном виде. Файлы с открытым текстом хранятся в виде целых чисел, где каждое целое число (иногда 2–4 целых числа) представляет символ.

Каждое целое число занимает в нашей системе байт, поэтому строки целых чисел, представляющие символы, называются байтовыми строками. Чтобы просмотреть текст в приложении (например, в текстовом редакторе, браузере, Python и т. д.), целые числа в строке байтов должны быть преобразованы в символы. Для этого приложение должно ссылаться на кодировку, указывающую целочисленное значение, соответствующее каждому символу в наборе символов. Каждый раз, когда мы смотрим на текст, будь то в редакторе, IDE, браузере или программе Python, строки байтов преобразуются в текст. Это происходит незаметно и плавно (хотя иногда вы можете увидеть знак ? в чате или на веб-странице — это означает, что конвертер не знал, как преобразовать это целое число).

Таблица ASCII: исходный набор символов

Исходный набор символов, впервые использованный на компьютерах, известен как таблица ascii. Если вы посмотрите на эту таблицу и выберете целые эквиваленты для «привет, мир!» вы увидите, что они совпадают с предыдущими привет, мир! пример.

Вы также можете увидеть аналогичный перевод в действии, используя функции ord() и chr():

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

Юникод: попытка создать универсальный набор символов

Существует много наборов символов; UTF-8 – наиболее распространенная кодировка Unicode.

Юникод в Python: кодирование и декодирование строк байтов

Строка – это последовательность символов; строка байтов — это последовательность целых чисел, представляющих каждый символ, отображаемый посредством кодировки .

Как мы уже говорили, весь текст хранится в виде целочисленных значений, каждое целое число представляет символ. При отображении текста целые числа должны быть преобразованы в символы. Это означает, что каждый раз, когда вы видите символы, представленные в файле — в редакторе, браузере или программе Python — эти символы были декодированы из целочисленных значений. Чтобы декодировать целое число в соответствующий символ, приложение должно обратиться к кодировке, которая отображает целочисленные значения в символы. ascii — одна из таких кодировок, utf-8 — другая. Это означает, что каждое строковое представление текста, которое вы видите, было декодировано из целых чисел с использованием кодировки.

Чтобы Python кодировал строку в целочисленную строку байтов, мы используем метод str.encode():

Строка байтов обозначается буквой b'' . Он печатает со строковыми символами, потому что Python по умолчанию применяет кодировку utf-8.

Чтобы декодировать строку байтов в строку, мы используем метод bytes.decode(), предоставляющий кодировку:

Большинство современных приложений, таких как Python, по умолчанию используют utf-8. Если мы хотим открыть файл с другой кодировкой, мы можем указать это в open() :

Мы также можем открыть файл для чтения как байты с аргументом rb:

И мы также можем записывать необработанные байты в файл:

Обработка ошибок декодирования и кодирования

Мы можем перехватывать ошибки декодирования и кодирования и/или удалять или заменять недопустимые символы.

Строки и строки байтов не содержат информации о кодировке; это означает, что даже они не «знают», какую кодировку они используют, и поэтому не могут сказать нам, какую кодировку использовать.

Итак, мы можем получить текст, который неправильно кодируем или декодируем:

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

Если мы обнаружим, что строка не может быть декодирована в указанную кодировку, мы можем либо удалить, либо заменить неизвестный символ:

'replace' создает только буквальный вопросительный знак для замены неизвестного символа; «игнорировать» удаляет его «прослушивание» кодировки строки байтов. Строка байтов не содержит метаинформации, поэтому она «не знает», какая кодировка использовалась для ее создания.

Python предоставляет модуль chardet, который может проверять строку байтов, чтобы определить ее кодировку. Мы называем этот вид доказательной экспертизы «обнюхиванием»:

Вероятно, вы знаете, что все на компьютере хранится в виде строк битов (двоичных цифр; вы можете думать о них как о множестве маленьких переключателей). Здесь мы объясним, как эти биты используются для представления букв и цифр, которые обрабатывает ваш компьютер.

Прежде чем мы приступим к этому, вам нужно понять размер слова вашего компьютера. Размер слова является предпочтительным размером компьютера для перемещения единиц информации; технически это ширина регистров вашего процессора, которые являются областями хранения, которые ваш процессор использует для выполнения арифметических и логических вычислений. Когда люди пишут о компьютерах с разрядностью (называя их, скажем, «32-битными» или «64-битными»), они имеют в виду именно это.

Большинство компьютеров теперь имеют размер слова 64 бита. В недавнем прошлом (начало 2000-х) многие ПК имели 32-битные слова. Старые машины 286 в 1980-х годах имели размер слова 16. В старых мейнфреймах часто использовались 36-битные слова.

Компьютер рассматривает вашу память как последовательность слов, пронумерованных от нуля до некоторого большого значения, зависящего от объема вашей памяти. Это значение ограничено размером вашего слова, поэтому программы на старых машинах, таких как 286, должны были пройти через болезненные искажения, чтобы адресовать большие объемы памяти. Я не буду описывать их здесь; они до сих пор вызывают кошмары у программистов постарше.

Целые числа представлены в виде слов или пар слов, в зависимости от размера слова вашего процессора. Одно 64-битное машинное слово является наиболее распространенным целочисленным представлением.

Целая арифметика близка к математической системе счисления по основанию два, но не совсем ей. Младший бит равен 1, затем 2, затем 4 и так далее, как в чистом двоичном коде. Но числа со знаком представлены в записи с дополнением до двух. Бит старшего разряда — это бит знака, который делает величину отрицательной, и каждое отрицательное число может быть получено из соответствующего положительного значения путем инвертирования всех битов и добавления единицы. Вот почему целые числа на 64-битной машине имеют диапазон от -2 63 до 2 63 - 1. Этот 64-й бит используется для знака; 0 означает положительное число или ноль, 1 — отрицательное число.

Некоторые компьютерные языки предоставляют вам доступ к беззнаковым арифметическим операциям, которые представляют собой прямое основание 2 только с нулями и положительными числами.

Большинство процессоров и некоторые языки могут выполнять операции с числами с плавающей запятой (эта возможность встроена во все современные чипы процессоров). Числа с плавающей запятой дают гораздо более широкий диапазон значений, чем целые числа, и позволяют выражать дроби. Способы, которыми это делается, различны и слишком сложны, чтобы подробно обсуждать их здесь, но общая идея очень похожа на так называемую «научную нотацию», где можно записать, скажем, 1,234 * 10 23 ; кодирование числа разделено на мантисса (1,234) и экспоненциальную часть (23) для множителя степени десяти (что означает, что умноженное число будет иметь 20 нулей, 23 минус три десятичных знака).

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

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

Было несколько попыток решить эту проблему. Все они используют дополнительный старший бит, которого нет в ASCII, что делает его младшей половиной набора из 256 символов. Наиболее широко используемым из них является так называемый набор символов «Latin-1» (более формально называемый ISO 8859-1). Это набор символов по умолчанию для Linux, старых версий HTML и X. Microsoft Windows использует измененную версию Latin-1, которая добавляет набор символов, таких как правые и левые двойные кавычки, в тех местах, где правильный Latin-1 оставляет неназначенными для исторических данных. причинам (обзорный отчет о проблемах, которые это вызывает, см. на странице деморонизатора).

Latin-1 поддерживает западноевропейские языки, включая английский, французский, немецкий, испанский, итальянский, голландский, норвежский, шведский, датский и исландский. Однако этого тоже недостаточно, и в результате существует целая серия наборов символов от латиницы от 2 до -9 для обработки таких вещей, как греческий, арабский, иврит, эсперанто и сербско-хорватский. Подробности см. на странице супа с алфавитом ISO.

Наилучшее решение — огромный стандарт Unicode (и его аналог ISO/IEC 10646-1:1993). Unicode идентичен Latin-1 в самых нижних 256 слотах. Над ними в 16-битном пространстве он включает греческий, кириллический, армянский, иврит, арабский, деванагари, бенгальский, гурмукхи, гуджарати, ория, тамильский, телугу, каннада, малаялам, тайский, лаосский, грузинский, тибетский, японский Кана, полный набор современных корейских хангыль и единый набор китайских/японских/корейских (CJK) иероглифов. Дополнительные сведения см. на домашней странице Unicode. XML и XHTML используют этот набор символов.

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