Подтвердить что ты не робот

Стандарт C: набор символов и спецификация строковой кодировки

Я обнаружил, что стандарт C (C99 и C11) неопределен относительно положений символьного/строкового кода и правил кодирования:

Во-первых, стандарт определяет the source character set и the execution character set. По сути, он предоставляет набор глифов, но не связывает никаких числовых значений с ними - Итак, что такое набор символов по умолчанию?

Я не спрашиваю о кодировке здесь, а просто глиф/репертуар для отображения числовых/кодовых точек. Он определяет universal character names как ISO/IEC 10646, но говорит ли он, что это кодировка по умолчанию?

Как дополнение к вышеизложенному - я не мог найти ничего, что говорит о том, какие символы числовые escape-последовательности\0 и \x представляют.

Из стандартов C (C99 и C11, я не проверял ANSI C), я получил следующее о символьных и строковых литералах:

 +---------+-----+------------+----------------------------------------------+
 | Literal | Std | Type       | Meaning                                      |
 +---------+-----+------------+----------------------------------------------+
 | '...'   | C99 | int        | An integer character constant is a  sequence |
 |         |     |            | of one or more multibyte characters          |
 | L'...'  | C99 | wchar_t    | A wide character constant is a sequence of   |
 |         |     |            | one or more multibyte characters             |
 | u'...'  | C11 | char16_t   | A wide character constant is a sequence of   |
 |         |     |            | one or more multibyte characters             |
 | U'...'  | C11 | char32_t   | A wide character constant is a sequence of   |
 |         |     |            | one or more multibyte characters             |
 | "..."   | C99 | char[]     | A character string literal is a sequence of  |
 |         |     |            | zero or more multibyte characters            |   
 | L"..."  | C99 | wchar_t[]  | A wide string literal is a sequence of zero  |
 |         |     |            | or more multibyte characters                 | 
 | u8"..." | C11 | char[]     | A UTF-8 string literal is a sequence of zero |
 |         |     |            | or more multibyte characters                 | 
 | u"..."  | C11 | char16_t[] | A wide string literal is a sequence of zero  |
 |         |     |            | or more multibyte characters                 | 
 | U"..."  | C11 | char32_t[] | A wide string literal is a sequence of zero  |
 |         |     |            | or more multibyte characters                 | 
 +---------+-----+------------+----------------------------------------------+

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

Я не знаком с спецификацией UNIX. Указывает ли спецификация UNIX какие-либо дополнительные ограничения для этих правил?

Также, если кто-нибудь может сказать мне , какая схема кодировки/кодирования используется GCC и MSVC, которая также поможет.

4b9b3361

Ответ 1

C не жадна к наборам символов. Нет такой вещи, как "набор символов по умолчанию", определенная реализация - хотя это в основном ASCII или UTF-8 для большинства современных систем.

Ответ 2

В стандарте не указывается кодировка по умолчанию, поскольку существующая практика уже реализована на C с множеством разных кодировок, например мэйнфреймами Honeywell и мэйнфреймами IBM.

Я бы ожидал, что gcc примет значение по умолчанию из локали, заданной в настоящее время LC_CHARSET, но я ее никогда не тестировал.

VС++ принимает значение по умолчанию из настройки панели управления. Эта настройка по умолчанию для панели управления зависит от того, в какой стране была приобретена Windows, и большинство пользователей ее никогда не меняют, но они могут ее изменить, в то время как Windows может изменить ее позже.

Триграфы были изобретены так, что исходная программа могла быть скопирована из среды с одной локалью в среду с немного другой локалью и все еще будет скомпилирована. Например, если пользователь Windows в Китае использует триграфы, тогда пользователь Windows в Греции сможет скомпилировать одну и ту же исходную программу. Однако, если локали слишком сильно отличаются друг от друга, например, с использованием EBCDIC и одного с использованием EUC, триграфов будет недостаточно.