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 . В этих системах обычно используется 16-битный тип «широкого символа» ( wchar_tв C/C++; charв Java). Эти типы не всегда напрямую сопоставляются с одним «символом», поскольку для хранения всего диапазона Юникода (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++ включают ряд средств для работы с широкими символами и строками , состоящими из них. Широкие символы определяются с использованием типа данных , который в исходном стандарте C90 определялся какwchar_t

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

И C, и C++ представили типы символов фиксированного размера char16_t, а char32_tв версиях соответствующих стандартов 2011 года они обеспечили однозначное представление 16-битных и 32-битных форматов преобразования Unicode , оставив wchar_tреализацию определяемой. Стандарт Unicode 4.0 ISO/IEC 10646:2003 гласит:

«Ширина wchar_tзависит от компилятора и может составлять всего 8 бит. Следовательно, программы, которые должны быть переносимы на любой компилятор C или C++, не должны использовать wchar_tдля хранения текста Unicode. Этот wchar_tтип предназначен для хранения определяемых компилятором широких символов. , которые в некоторых компиляторах могут быть символами Юникода ». [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. ^ «Класс строк (система)» . Learn.microsoft.com .
  3. ^ «Примитивные типы данных (Учебные пособия по Java™> Изучение языка Java> Основы языка)» . docs.oracle.com .
  4. ^ "Широкие строки с нулевым завершением <wctype.h> - cppreference.com" . ru.cppreference.com .
  5. ^ «UTF-8 везде» . В последующие годы многие системы добавили поддержку Unicode и перешли на кодировку UCS-2. Это было особенно привлекательно для новых технологий, таких как фреймворк Qt (1992 г.), Windows NT 3.1 (1993 г.) и Java (1995 г.).
  6. ^ "5.2 ANSI/ISO C wchar_t" . Стандарт Юникод. Алипранд, Джоан, Консорциум Unicode. (Версия 4.0 изд.). Бостон: Аддисон-Уэсли. 2003. с. 109. ИСБН 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 г.

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