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 Восьмеричные и шестнадцатеричные последовательности escape-последовательностей не подвергаются преобразованию; '\x12' имеет значение 0x12 независимо от текущего выбранного исполняемого набора символов. Все остальные escape-последовательности заменяются символом в исходном наборе символов, который они представляют, затем преобразуются в выполняемый набор символов, точно так же, как и неэкранированные символы.
В идентификаторах символы, находящиеся за пределами диапазона ASCII, могут быть заданы только с помощью escape-последовательностей ‘\u’ и ‘\U’, а не напрямую. Если указана строгая совместимость с ISO C90 с помощью такой опции, как -std=c90, или используется -fno-extended-identifiers, то эти escape-последовательности не допускаются в идентификаторах.
Примечания
UTF-16 не удовлетворяет требованиям стандарта C для набора символов с расширенными типами, но выбор 16-битного wchar_t закреплен в некоторых системных ABIs, поэтому мы не можем это исправить.
Далее: Начальная обработка, Вверх: Обзор [Оглавление][Индекс]
© Free Software Foundation
Licensed under the GNU Free Documentation License, Version 1.3.
https://gcc.gnu.org/onlinedocs/gcc-9.5.0/cpp/Character-sets.html