A широкий символ компьютер символ тип данных, который обычно имеет размер больше, чем традиционный 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-битное значение.
Подобно тому, как ранние системы передачи данных страдали от отсутствия 8-битного чистого тракта данных, современные системы передачи часто не поддерживают 16-битные символы. битовые или 32-битные пути данных для символьных данных. Это привело к появлению систем кодирования символов, таких как UTF-8, которые могут использовать несколько байтов для кодирования значения, которое слишком велико для одного 8-битного символа.
Стандарт C различает многобайтовые кодировки символов, в которых используется фиксированное или переменное количество байтов для представления каждого символа (в основном используется в исходном коде и внешних файлах), от широких символов, которые являются во время выполнения представлениями символов в отдельных объектах (обычно больше 8 бит).
UTF-16 с прямым порядком байтов - это стандарт кодирования в Microsoft (и в операционной системе Windows). Но с суррогатными парами он также поддерживает 32-битные. Платформа .NET Framework поддерживает несколько реализаций широких символов, включая UTF7, UTF8, UTF16 и UTF32.
Платформа Java требует, чтобы переменные широких символов были определены как 16 -битовые значения, и символы должны быть закодированы с использованием UTF-16 (из-за прежнего использования UCS-2), в то время как современные Unix -подобные системы обычно требуют UTF-8 в своих интерфейсах.
Стандартные библиотеки C и C ++ включают ряд возможностей для работы с широкими символами и строками, состоящими из них. Широкие символы определяются с использованием типа данных wchar_t
, который в исходном стандарте C90 был определен как
В C и C ++ представлены типы символов фиксированного размера char16_t
и char32_t
в редакциях соответствующих стандартов 2011 г., чтобы обеспечить недвусмысленное представление 16-битных и 32-битных форматов преобразования Unicode, оставляя wchar_t
определяемым реализацией. В стандарте 4.0 ISO / IEC 10646: 2003 Unicode говорится, что:
wchar_t
зависит от компилятора и может составлять всего 8 бит. Следовательно, программы, которые должен быть переносимым через любой компилятор C или C ++ не должен использовать wchar_t
для хранения текста Unicode. Тип wchar_t
предназначен для хранения определенных компилятором широких символов, которые могут быть Символы Unicode в некоторых компиляторах. "Согласно документации Python, язык иногда использует wchar_t
в качестве основы для своего символа введите Py_UNICODE
. Это зависит от того, "совместим ли wchar_t
с выбранным вариантом сборки Python Unicode" в этой системе.