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, то такие конструкции не допускаются в идентификаторах.
Примечания
(1)
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-14.2.0/cpp/Character-sets.html