Encoding default c: What is the default encoding for C strings?

Какова кодировка по умолчанию для строк C?

Я знаю, что строки C представляют собой char[] с ‘\0’ в последнем элементе. Но как кодируются символы?

Обновление: я нашел эту классную ссылку, в которой рассказывается о многих других языках программирования и их соглашениях по кодированию: строчные буквы латинского алфавита, цифры от 0 до 9, символы 9_ { | } ~ , а также символ пробела и управляющие символы, представляющие горизонтальную табуляцию, вертикальную табуляцию, перевод страницы, предупреждение, возврат каретки и новую строку.

Единственное, что там говорится о числовой кодировке, это то, что все вышеперечисленное умещается в один байт, и что значение каждой цифры после нуля на единицу больше, чем значение предыдущей.

Фактическая кодировка, вероятно, унаследована от ваших региональных настроек. Вероятно, что-то ASCII-совместимое.

4

Строка c — это просто последовательность байтов.

Это означает, что у него нет четко определенной кодировки, это может быть ASCII, UTF8 или что-то еще, если уж на то пошло. Поскольку большинство операционных систем по умолчанию понимают ASCII, а исходный код в основном написан с кодировкой ASCII, поэтому данные, которые вы найдете в простом (char*), очень часто также будут ASCII. Тем не менее, нет никакой гарантии, что то, что вы получите из (char*), будет UTF8 или даже KOI8.

4

В стандарте это не указано. Обычно с ASCII.

4

Как уже указывалось, C имеет некоторые ограничения на то, что разрешено для кодировок исходных и исполняемых символов, но является относительно разрешительным. Так что, в частности, это не обязательно ASCII, и в большинстве случаев в настоящее время, по крайней мере, его расширение.

Ваша среда выполнения предназначена для возможного преобразования между исходным набором символов и набором символов выполнения.

Так что, как правило, вы не должны заботиться о кодировке и, наоборот, пытаться кодировать независимо от нее. Вот почему существуют специальные escape-последовательности для специальных символов, таких как 9.0013 ‘\n’ или '\t' и универсальные кодировки символов, такие как '\u0386' . Поэтому обычно вам не нужно искать кодировку для набора символов выполнения самостоятельно.

На самом деле они не «закодированы» как таковые, они просто хранятся как есть. Строка «hello» представляет собой массив со значениями char 'h' , 'e' , 'l' , 'l' , 'o' и '\0' , в этот порядок. Стандарт C имеет базовый набор символов, который включает эти символы, но не определяет кодировку в байты. Это может быть EBCDIC, насколько вам известно.

6

Зарегистрируйтесь или войдите в систему

Зарегистрируйтесь с помощью Google

Зарегистрироваться через Facebook

Зарегистрируйтесь, используя адрес электронной почты и пароль

Опубликовать как гость

Электронная почта

Требуется, но не отображается

Опубликовать как гость

Электронная почта

Требуется, но не отображается

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

Я нашел стандарт C (C99 и C11) расплывчатым в отношении позиций кода символов/строк и правил кодирования:

Во-первых, стандарт определяет исходный набор символов и набор исполняемых символов . По сути, он предоставляет набор глифов, но не связывает числовые значения. с ними — Так какой набор символов по умолчанию?

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

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

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

 +---------+-----+-------------+------------ ----------------------------------+
 | Буквальный | Стандарт | Тип | Значение |
 +---------+-----+-------------+------ --------------------------+
 | '...' | С99 | инт | Константа целочисленного символа представляет собой последовательность |
 | | | | одного или нескольких многобайтовых символов |
 | Л'.
..' | С99 | wchar_t | Широкая символьная константа представляет собой последовательность | | | | | один или несколько многобайтовых символов | | у'...' | С11 | char16_t | Широкая символьная константа представляет собой последовательность | | | | | один или несколько многобайтовых символов | | У'...' | С11 | char32_t | Широкая символьная константа представляет собой последовательность | | | | | один или несколько многобайтовых символов | | "..." | С99 | символ [] | Литерал символьной строки представляет собой последовательность | | | | | ноль или более многобайтовых символов | | Л"..." | С99 | wchar_t[] | Широкий строковый литерал — это последовательность нулей | | | | | или более многобайтовых символов | | у"..." | С11 | char16_t[] | Широкий строковый литерал — это последовательность нулей | | | | | или более многобайтовых символов | | У"..." | С11 | char32_t[] | Широкий строковый литерал — это последовательность нулей | | | | | или более многобайтовых символов | | u8"..." | С11 | символ[] | Строковый литерал UTF-8 представляет собой последовательность нулей | | | | | или более многобайтовых символов | +---------+-----+-------------+------ --------------------------+

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

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

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

  • c++
  • c
  • кодировка символов
  • char
  • строковые литералы

0

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

4

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

Оставить комментарий

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *