Широкий символ

Эта статья входит в число готовых статей
Эта статья прошла проверку экспертом
Материал из «Знание.Вики»

Широ́кий си́мвол — это термин, применяемый в программировании. Представляет собой расширенный символ, который используется для обозначения символьного типа данных[1]. На Windows занимает в памяти 2 байта (16 бит), на Linux - 4 байта (32 бита). Может хранить любой значение из диапазона от 0 до 65 535 (при 2 байтах), либо от 0 до 4 294 967 295 (для 4 байт)[2].

История

В 1960-х годах производители мэйнфреймов и мини-компьютеров начали стандартизировать 8-битный тип данных byte как наименьший тип данных. 7-битный набор символов ASCII стал стандартным отраслевым методом кодирования буквенно-цифровые символы для телетайпных машин и компьютерных терминалов. Дополнительный бит использовался для обеспечения четности, чтобы обеспечить целостность хранения и передачи данных. В результате 8-битный байт стал de facto тип данных для компьютерных систем, хранящих символы ASCII в памяти.

Позже производители компьютеров начали использовать запасной бит для расширения набора символов ASCII за пределы его ограниченного набора Английский алфавит Персонажи. 8-разрядные расширения такие как IBM code page 37, PETSCII и ISO 8859 стал обычным явлением, предлагая поддержку терминалов для Греческий, Кириллица и многие другие. Однако такие расширения по-прежнему были ограничены тем, что зависели от региона и часто не могли использоваться в паре. Для преобразования из одного набора символов в другой приходилось использовать специальные процедуры преобразования, что часто приводило к деструктивному переводу, когда в целевом наборе не существовало эквивалентного символа.

В 1989 году Международная организация по стандартизации начала работу над Универсальным набором символов (UCS), многоязычный набор символов, который может быть закодирован с использованием либо 16-битного (2-байтового), либо 32-битного (4-байтового) значения. Эти большие значения требовали использования типа данных, превышающего 8 бит, для хранения новых символьных значений в памяти. Таким образом, термин «широкий символ» использовался для отличия их от традиционных 8-битных символьных типов данных[3].

Использование

Тип данных wchar_t по стандартам ANSI/ISO C (а также применяемый в других языках программирования) предназначен для представления широких символов[4].

Стандарт Unicode 4.0 указывает:

«ANSI/ISO C оставляет семантику широких символов на усмотрение конкретной реализации»

а ещё

«размер типа wchar_t определяется компилятором, вплоть до минимальных 8 бит. Соответственно, приложения, которым требуется сохранять переносимость на различных C и C++ компиляторах, не должны использовать wchar_t для хранения Unicode-текста. Тип wchar_t предназначен для хранения широких символов в том виде, в котором их понимают конкретные компиляторы, и это может не соответствовать Юникоду».

В Windows API тип wchar_t носит обозначение WCHAR и имеет установленные 16-битные размеры, что ограничивает возможность кодирования полного набора символов Unicode (свыше 1 миллиона).

Это нарушает требования стандарта ANSI/ISO C, который предписывает, чтобы любой символьный тип wchar_t был способен содержать все символы системы в одном объекте wchar_t. На практике в WinAPI под WCHAR понимается 16-битное слово из кодировки UTF-16LE (типа WORD), вследствие чего символы с кодами более FFFF16 кодируются парными WCHAR (так называемые «суррогаты»), и все API-функции получают не число символов, а размер массива символов в машинных словах.

В GNU/Linux тип wchar_t представлен 32-битной величиной. В библиотеке ANSI C за работу с широкими символами отвечают заголовочные файлы <wchar.h> и <wctype.h>[2].

Ссылки

Примечания

  1. Юникод: широкий набор символов. © Microsoft 2024. Дата обращения: 27 сентября 2024.
  2. 2,0 2,1 Типы данных. metanit.com. Дата обращения: 27 сентября 2024.
  3. Грустная история забытых символов. Как не сойти с ума при работе с кодировками в C++. habr.com (20 мая 2015). Дата обращения: 27 сентября 2024.
  4. Роббинс А. Linux программирование в примерах. — М.: КУДИЦ-образ, 2005. — С. 345. — 653 с. — ISBN 5-9579-0059-1.