1.1 Наборы символов
Обработка наборов символов исходного кода в C и родственных языках довольно сложная. Стандарт C обсуждает два набора символов, но на самом деле их, по меньшей мере, четыре.
Файлы, вводимые в CPP, могут быть в любом наборе символов. Первым действием CPP, даже до поиска границ строк, является преобразование файла в набор символов, используемый для внутренней обработки. Этот набор называется исходным набором символов в соответствии со стандартом C. Он должен быть изоморфен ISO 10646, также известному как Unicode. CPP использует кодировку UTF-8 Unicode.
Наборы символов входных файлов задаются с помощью опции -finput-charset=.
Вся предварительная обработка (предмет остальной части данного руководства) выполняется в исходном наборе символов. Если вы запрашиваете текстовый вывод от препроцессора с помощью опции -E, он будет в формате UTF-8.
После завершения предварительной обработки строковые и символьные константы преобразуются еще раз в выполняемый набор символов. Этот набор символов находится под управлением пользователя; по умолчанию используется UTF-8, соответствующий исходному набору символов. У широких строковых и символьных констант есть свой набор символов, который не указан в стандарте. Опять же, он находится под управлением пользователя. По умолчанию используется UTF-16 или UTF-32, какой из них подходит для типа wchar_t целевого объекта в порядке байтов целевой машины.1 Восьмеричные и шестнадцатеричные управляющие последовательности не преобразуются; '\x12' имеет значение 0x12 независимо от текущего выбранного выполняемого набора символов. Все остальные управляющие последовательности заменяются символом в исходном наборе символов, который они представляют, а затем преобразуются в набор символов выполнения, точно так же, как и незамещенные символы.
В идентификаторах символы, находящиеся за пределами диапазона ASCII, могут быть заданы с помощью управляющих последовательностей ‘\u’ и ‘\U’ или использоваться напрямую в кодировке входных данных. Если строгое соответствие стандарту ISO C90 задано с помощью такой опции, как -std=c90, или используется -fno-extended-identifiers, то эти конструкции запрещены в идентификаторах.
Примечания
UTF-16 не соответствует требованиям стандарта C для широкого набора символов, но выбор 16-битного wchar_t закреплен в некоторых системных ABI, поэтому мы не можем это исправить.
Далее: Первичная обработка, Назад: Обзор [Содержание][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-12.1.0/cpp/Character-sets.html