Широкий символ — это тип данных компьютерного символа , который обычно имеет размер больше, чем традиционный 8-битный символ. Увеличенный размер типа данных позволяет использовать более крупные кодированные наборы символов .
В 1960-х годах производители мэйнфреймов и мини-компьютеров начали стандартизировать 8-битный байт как наименьший тип данных. 7-битный набор символов ASCII стал отраслевым стандартом для кодирования буквенно-цифровых символов для телетайпных машин и компьютерных терминалов . Дополнительный бит использовался для четности, чтобы гарантировать целостность хранения и передачи данных. В результате 8-битный байт стал фактическим типом данных для компьютерных систем, хранящих символы ASCII в памяти.
Позже производители компьютеров начали использовать запасной бит для расширения набора символов ASCII за пределы его ограниченного набора символов английского алфавита . 8-битные расширения, такие как кодовая страница IBM 37, PETSCII и ISO 8859, стали обычным явлением, предлагая поддержку терминала для греческого , кириллического и многих других. Однако такие расширения все еще были ограничены тем, что были регионально-специфичными и часто не могли использоваться в тандеме. Для преобразования из одного набора символов в другой приходилось использовать специальные процедуры преобразования, что часто приводило к деструктивному переводу, когда в целевом наборе не было эквивалентного символа.
В 1989 году Международная организация по стандартизации начала работу над Универсальным набором символов (UCS), многоязычным набором символов, который можно было кодировать с использованием 16-битного (2-байтового) или 32-битного (4-байтового) значения. Эти большие значения требовали использования типа данных, большего 8 бит, для хранения новых значений символов в памяти. Таким образом, термин «широкий символ» использовался для их отличия от традиционных 8-битных типов данных символов.
Широкий символ относится к размеру типа данных в памяти. Он не устанавливает, как определяется каждое значение в наборе символов. Вместо этого эти значения определяются с помощью наборов символов, при этом UCS и Unicode — это просто два общих набора символов, которые кодируют больше символов, чем позволяет 8-битное числовое значение (всего 255).
Так же, как более ранние системы передачи данных страдали от отсутствия 8-битного чистого пути данных, современные системы передачи часто не поддерживают 16-битные или 32-битные пути данных для символьных данных. Это привело к появлению систем кодирования символов, таких как UTF-8 , которые могут использовать несколько байтов для кодирования значения, которое слишком велико для одного 8-битного символа.
Стандарт языка C различает многобайтовые кодировки символов, которые используют фиксированное или переменное число байтов для представления каждого символа (в основном используются в исходном коде и внешних файлах), и широкие символы , которые являются представлениями символов во время выполнения в отдельных объектах (обычно более 8 бит).
Раннее принятие UCS-2 ("Unicode 1.0") привело к общему использованию UTF-16 на ряде платформ, в первую очередь Microsoft Windows , .NET и Java . В этих системах обычно используется тип "широкого символа" ( wchar_t
в C/C++; char
в Java) длиной 16 бит. Эти типы не всегда напрямую сопоставляются с одним "символом", поскольку для хранения полного диапазона Unicode (1996, Unicode 2.0) требуются суррогатные пары . [1] [2] [3]
Unix-подобные системы обычно используют 32-битную кодировку wchar_t
для соответствия 21-битной кодовой точке Unicode, как предписано C90. [4]
Размер типа широкого символа не диктует, какие текстовые кодировки может обрабатывать система, поскольку доступны преобразования. (Однако старый код преобразования обычно игнорирует суррогаты.) Исторические обстоятельства их принятия также определяют, какие типы кодировок они предпочитают . Система, на которую повлиял Unicode 1.0, такая как Windows, имеет тенденцию в основном использовать «широкие строки», состоящие из единиц широких символов. Другие системы, такие как Unix-подобные, однако, имеют тенденцию сохранять соглашение о 8-битной «узкой строке», используя многобайтовую кодировку (почти повсеместно UTF-8) для обработки «широких» символов. [5]
Стандартные библиотеки C и C++ включают ряд возможностей для работы с широкими символами и строками, составленными из них. Широкие символы определяются с помощью datatype wchar_t
, который в исходном стандарте C90 был определен как
И C, и C++ ввели типы символов фиксированного размера char16_t
и char32_t
в редакциях 2011 года своих соответствующих стандартов, чтобы обеспечить однозначное представление 16-битных и 32-битных форматов преобразования Unicode , оставив wchar_t
реализацию определенной. Стандарт Unicode ISO/IEC 10646:2003 4.0 гласит, что:
wchar_t
зависит от компилятора и может быть всего 8 бит. Следовательно, программы, которые должны быть переносимыми между любыми компиляторами C или C++, не должны использовать его wchar_t
для хранения текста Unicode. wchar_t
Тип предназначен для хранения широких символов, определяемых компилятором, которые могут быть символами Unicode в некоторых компиляторах». [6]Согласно документации Python 2.7, язык иногда использует wchar_t
в качестве основы для своего символьного типа Py_UNICODE
. Это зависит от того, wchar_t
«совместимо ли с выбранным вариантом сборки Python Unicode» в этой системе. [7] Это различие устарело с Python 3.3, который представил гибкое хранилище UCS1/2/4 для строк и формально связан Py_UNICODE
с wchar_t
. [8] Начиная с Python 3.12 использование wchar_t
, т. е. Py_UNICODE
typedef , для строк Python (wstr в реализации) было прекращено, и по-прежнему, как и прежде, « представление UTF-8 создается по требованию и кэшируется в объекте Unicode». [9]
В последующие годы многие системы добавили поддержку Unicode и перешли на кодировку UCS-2. Она была особенно привлекательна для новых технологий, таких как фреймворк Qt (1992), Windows NT 3.1 (1993) и Java (1995).
{{cite book}}
: CS1 maint: другие ( ссылка )