Наборы символов - непонятно

Стандарт определяет

  • набор основных исходных символов

  • набор основных исполнений и его широкоформатный char

Он также определяет "набор символов выполнения" и его широкоэкранный char следующим образом

$2.2/3- "Набор символов выполнения и набор символов широкого исполнения являются надмножествами основного исполнения набор символов и базовое исполнение широкоугольный набор, соответственно. значения членов казни наборы символов определенную реализацию, и любые дополнительные члены локализированный".

Q1. Я не думаю, что понимаю это полностью, особенно последнее утверждение. Любые указатели на этот аспект?

Далее

$3.9.1 - "Объекты, объявленные как символы (char) должны быть большими достаточно для хранения любого члена реализаций базового набора символов."

Q2. В 3.9.1 фраза "базовый набор символов" означает "базовый набор символов выполнения"?

Ответ 1

Вам нужно различать исходный набор символов, набор символов выполнения, набор символов проводки и его базовые версии:

Основной набор символов:

§2.1.1: Основной набор символов источника состоит из 96 символов [...]

Этот набор символов имеет ровно 96 символов. Они вписываются в 7 бит. Символы типа @ не включены.

Позвольте получить несколько примерных двоичных представлений для нескольких основных исходных символов. Они могут быть полностью произвольными, и нет необходимости, чтобы они соответствовали значениям ASCII.

A -> 0000000
B -> 0100100
C -> 0011101

Основной набор символов выполнения...

§2.1.3: Основной набор символов выполнения и набор символов широкого исполнения должны содержать все элементы базового набора символов источника, а также управляющие символы, представляющие предупреждение, обратное пространство и возврат каретки, плюс нулевой символ (соответственно нулевой широкий символ), представление которого имеет все нулевые биты.

Как указано, основной набор символов выполнения содержит все элементы базового исходного набора символов. Он по-прежнему не содержит никаких других символов, таких как @. Основной набор символов выполнения может иметь различное двоичное представление.

Как указано, основной набор символов выполнения содержит представления для возврата каретки, нулевой символ и другие символы.

A          -> 10110101010
B          -> 00001000101    <- basic source character set
C          -> 10101011111
----------------------------------------------------------
null       -> 00000000000
Backspace  -> 11111100011

Если базовый набор символов выполнения имеет длину 11 бит (как в этом примере), тип данных char должен быть достаточно большим, чтобы хранить 11 бит, но может быть длиннее.

... и набор символов широкого исполнения:

Символ основного исполнения широко используется для широких символов (wchar_t). Это на самом деле то же самое, что и основной набор символов широкого исполнения, но также может иметь разные двоичные представления.

A          -> 1011010101010110101010
B          -> 0000100010110101011111    <- basic source character set
C          -> 1010100101101000011011
---------------------------------------------------------------------
null       -> 0000000000000000000000
Backspace  -> 1111110001100000000001

Единственный фиксированный член - это нулевой символ, который должен быть последовательностью бит 0.

Преобразование между базовыми наборами символов:

§2.1.1.5: Каждый элемент набора исходных символов, escape-последовательность или универсальное имя-символа в символьных литералах и строковых литералах преобразуется в член набора символов выполнения (2.13.2, 2.13.4).

Затем скомпилируется исходный файл С++, каждый символ исходного набора символов преобразуется в основной набор символов (широкий).

Пример:

const char* string0   =  "BA\bC";
const wchar_t string1 = L"BA\bC";

Так как string0 является нормальным символом, он будет преобразован в базовый набор символов выполнения, а string1 будет преобразован в набор символов основного исполнения.

string0 -> 00001000101 10110101010 11111100011 10101011111
string1 -> 0000100010110101011111 1011010101010110101010    // continued
           1111110001100000000001 1010100101101000011011

Кое-что о кодировании файлов:

Существует несколько типов кодировок файлов. Например ASCII, длина которого 7 бит. Windows-1252, который длится 8 бит (известный как ANSI). ASCII не содержит неанглийских символов. ANSI содержит некоторые европейские символы, такие как ä Ö ä Õ ø.

Новые кодировки файлов, такие как UTF-8 или UTF-32 может содержать символы любого языка. UTF-8 - символы переменной длины. UTF-32 длиной 32 бит.

Требования к защите файлов:

Большинство компиляторов предлагают ключ командной строки для указания кодировки файла исходного файла.

Исходный файл С++ должен быть закодирован в кодировке файла, которая имеет представление базового набора символов источника. Например: Кодировка файла исходного файла должна иметь представление символа ;.

Если вы можете ввести символ ; в кодировку, выбранную в качестве кодировки исходного файла, что кодировка не подходит в качестве кодировки исходного файла С++.

Неосновные наборы символов:

Символы, не включенные в основной набор символов источника, принадлежат к набору символов источника. Исходный набор символов эквивалентен кодировке файла.

Например: символ @ не включается в основной символ источника, но может быть включен в набор символов источника. Выбранная кодировка файла входного исходного файла может содержать представление @. Если он не содержит представления для @, вы не можете использовать символ @ внутри строк.

Символы, не включенные в базовый (широкий) набор символов, относятся к набору символов (широкий).

Помните, что компилятор преобразует символ из исходного набора символов в набор символов выполнения и набор символов широкого исполнения. Поэтому должен быть способ преобразования этих символов.

Например: Если вы указываете Windows-1252 как кодировку исходного набора символов и указываете ASCII как набор символов широкого исполнения, нет способа преобразовать эту строку:

const char* string0 = "string with European characters ö, Ä, ô, Ð.";

Эти символы не могут быть представлены в ASCII.

Указание наборов символов:

Вот несколько примеров того, как указать наборы символов, используя gcc. Значения по умолчанию включены.

-finput-charset=UTF-8         <- source character set
-fexec-charset=UTF-8          <- execution character set
-fwide-exec-charset=UTF-32    <- execution wide character set

С UTF-8 и UTF-32 в качестве кодировки по умолчанию исходные файлы С++ могут содержать строки с символом любого языка. Символы UTF-8 могут преобразовывать оба пути без проблем.

Расширенный набор символов:

§1.1.3: многобайтовый символ, последовательность из одного или нескольких байтов, представляющая элемент расширенного набора символов либо источника, либо среды выполнения. Расширенный набор символов является надмножеством базового набора символов (2.2).

Многобайтовый символ длиннее, чем запись нормальных символов. Они содержат escape-последовательность, обозначающую их как многобайтовый символ.

Многобайтные символы обрабатываются согласно языку, установленному в среде выполнения пользователя. Эти многобайтовые символы преобразуются во время выполнения в набор кодировок в пользовательской среде.