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 независимо от текущего выбранного набора символов выполнения. Все остальные экранированные последовательности заменяются символом в исходном наборе символов, который они представляют, а затем преобразуются в набор символов выполнения, точно так же, как и неэкранированные символы.
Если не используется экспериментальная опция -fextended-identifiers, GCC не допускает использование символов, выходящих за пределы диапазона ASCII, а также ‘\u’ и ‘\U’ экранированные последовательности в идентификаторах. Даже с этой опцией символы, выходящие за пределы диапазона ASCII, могут быть указаны только с помощью ‘\u’ и ‘\U’ экранированием, а не непосредственно в идентификаторах.
Примечания
[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-4.9.4/cpp/Character-sets.html