stringtranslate.com

Широкий характер

Широкий символ — это тип данных компьютерного символа , который обычно имеет размер больше, чем традиционный 8-битный символ. Увеличенный размер типа данных позволяет использовать более крупные кодированные наборы символов .

История

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

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

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

Связь с UCS и Unicode

Широкий символ относится к размеру типа данных в памяти. Он не устанавливает, как определяется каждое значение в наборе символов. Вместо этого эти значения определяются с помощью наборов символов, при этом 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 был определен как

«целочисленный тип, диапазон значений которого может представлять отдельные коды для всех членов наибольшего расширенного набора символов, указанного среди поддерживаемых локалей» (ISO 9899:1990 §4.1.5)

И 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]

Ссылки

  1. ^ "Глобализация шаг за шагом: поддержка Unicode". msdn.microsoft.com . Архивировано из оригинала 1 января 2009 г.
  2. ^ "Класс String (система)". learn.microsoft.com .
  3. ^ «Примитивные типы данных (Учебники Java™ > Изучение языка Java > Основы языка)». docs.oracle.com .
  4. ^ "Широкие строки с завершающим нулем <wctype.h> - cppreference.com". en.cppreference.com .
  5. ^ "UTF-8 Everywhere". В последующие годы многие системы добавили поддержку Unicode и перешли на кодировку UCS-2. Она была особенно привлекательна для новых технологий, таких как фреймворк Qt (1992), Windows NT 3.1 (1993) и Java (1995).
  6. ^ "5.2 ANSI/ISO C wchar_t". Стандарт Unicode. Aliprand, Joan., Unicode Consortium. (Версия 4.0 ред.). Бостон: Addison-Wesley. 2003. стр. 109. ISBN 0-321-18578-1. OCLC  52257637.{{cite book}}: CS1 maint: другие ( ссылка )
  7. ^ "Объекты и кодеки Unicode — документация Python 2.7". docs.python.org . Получено 19 декабря 2009 г. .
  8. ^ «Объекты и кодеки Unicode — документация Python 3.10.10». docs.python.org . Получено 18 февраля 2023 г. .
  9. ^ "Объекты и кодеки Unicode". Документация Python . Получено 9 сентября 2023 г.

Внешние ссылки