Широкий характер
Эта статья нуждается в дополнительных ссылок для проверки . ( февраль 2011 г. ) |
Широкий символ компьютерного символа — это тип данных , размер которого обычно превышает размер традиционного 8-битного символа. Увеличенный размер типа данных позволяет использовать более крупные наборы кодированных символов .
История [ править ]
В 1960-х годах производители мэйнфреймов и мини-компьютеров начали стандартизировать 8-битный байт как наименьший тип данных. 7-битный набор символов ASCII стал стандартным методом кодирования буквенно-цифровых символов для телетайпов и компьютерных терминалов . Дополнительный бит использовался для контроля четности, чтобы обеспечить целостность хранения и передачи данных. В результате 8-битный байт стал де-факто типом данных для компьютерных систем, хранящих в памяти символы ASCII.
Позже производители компьютеров начали использовать запасной бит, чтобы расширить набор символов ASCII за пределы ограниченного набора символов английского алфавита . 8-битные расширения , такие как кодовая страница IBM 37, PETSCII и ISO 8859, стали обычным явлением, предлагая терминальную поддержку греческого языка , кириллицы и многих других. Однако такие расширения по-прежнему были ограничены, поскольку они зависели от региона и часто не могли использоваться в тандеме. Для преобразования одного набора символов в другой приходилось использовать специальные процедуры преобразования, что часто приводило к деструктивному переводу, когда в целевом наборе не существовало эквивалентного символа.
В 1989 году Международная организация по стандартизации начала работу над универсальным набором символов (UCS), многоязычным набором символов, который можно было закодировать с использованием 16-битного (2-байтового) или 32-битного (4-байтового) значения. Эти большие значения требовали использования типа данных размером более 8 бит для хранения новых значений символов в памяти. Таким образом, термин «широкий символ» использовался, чтобы отличать их от традиционных 8-битных символьных типов данных.
Связь с Unicode UCS и
Широкий символ относится к размеру типа данных в памяти. В нем не указано, как определяется каждое значение в наборе символов. Вместо этого эти значения определяются с использованием наборов символов, при этом 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
на С/С++; char
в Java) типа 16-бит. Эти типы не всегда сопоставляются непосредственно с одним «символом», поскольку суррогатные пары . для хранения всего диапазона Юникода (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++ включают ряд средств для работы с широкими символами и строками, состоящими из них. Широкие символы определяются с использованием типа данных wchar_t
, который в исходном стандарте C90 определялся как
- «целочисленный тип, диапазон значений которого может представлять отдельные коды для всех членов наибольшего расширенного набора символов, указанного среди поддерживаемых локалей» (ISO 9899:1990 §4.1.5)
И 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
type предназначен для хранения определяемых компилятором широких символов, которые в некоторых компиляторах могут быть символами Юникода ». [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» . msdn.microsoft.com . Архивировано из оригинала 1 января 2009 года.
- ^ «Строковый класс (система)» . Learn.microsoft.com .
- ^ «Примитивные типы данных (Учебные пособия по Java™ > Изучение языка Java > Основы языка)» . docs.oracle.com .
- ^ «Широкие строки с нулевым завершением <wctype.h> — cppreference.com» . ru.cppreference.com .
- ^ «UTF-8 везде» .
В последующие годы многие системы добавили поддержку Unicode и перешли на кодировку UCS-2. Это было особенно привлекательно для новых технологий, таких как фреймворк Qt (1992 г.), Windows NT 3.1 (1993 г.) и Java (1995 г.).
- ^ «5.2 ANSI/ISO C wchar_t». Стандарт Юникод . Алипранд, Джоан, Консорциум Unicode. (Версия 4.0 изд.). Бостон: Аддисон-Уэсли. 2003. с. 109. ИСБН 0-321-18578-1 . OCLC 52257637 .
{{cite book}}
: CS1 maint: другие ( ссылка ) - ^ «Объекты и кодеки Unicode — документация Python 2.7» . docs.python.org . Проверено 19 декабря 2009 г.
- ^ «Объекты и кодеки Unicode — документация Python 3.10.10» . docs.python.org . Проверено 18 февраля 2023 г.
- ^ «Объекты и кодеки Unicode» . Документация Python . Проверено 9 сентября 2023 г.
Внешние ссылки [ править ]
- Стандарт Unicode, версия 4.0 — онлайн-издание
- Широкие символьные функции C @ Java2S
- Функции Java Unicode @ Java2S
- Многобайтовый (3) Справочная страница @ FreeBSD.org
- Многобайтовые и широкие символы @ Microsoft Developer Network
- Наборы символов Windows @ Microsoft Developer Network
- Справочник по программированию Unicode и наборов символов @ Microsoft Developer Network
- Поддержка многобайтовых символов должна быть простой @ EuroBSDCon, Белград, 25 сентября 2016 г.