2010-10-22 4 views
12

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

Обновление: Я нашел этот прохладный ссылку, которая говорит о многих других языках программирования и их условные кодирования: Link

ответ

7

Все стандарты говорят, что вы получаете по меньшей мере 52 символа латинского алфавита верхнего и нижнего регистра, цифры от 0 до 9, символы ! " # % & ' () * + , - ./: ; <=> ? [ \ ]^_ { | } ~ и символ пробела, а также управляющие символы, представляющие горизонтальную вкладку , вертикальная вкладка и подача формы.

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

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

+0

Я предполагаю, что локаль также настраивается в компиляторе. Просто узнал о опции gcc -finput-charset (http://gcc.gnu.org/onlinedocs/cpp/Invocation.html). По умолчанию используется UTF8. Неудивительно, что я смог напечатать UTF8Strings. – Plumenator

+0

Означает ли стандарт что-либо об порядковых значениях алфавитов? – Plumenator

+0

@Plumenator: Нет. Нет даже требования, чтобы «A» <«B». –

6

Стандарт не определяет это. Обычно с ASCII.

+0

В Objective-C Я могу создать строки C, используя высказывание: char * cStr = [objcStr UTF8String] и напечатать как printf («% s», cStr). Это работает, потому что ASCII является подмножеством UTF8? – Plumenator

+0

Да, ASCII - это подмножество UTF8. – fresskoma

+3

@Plumenator Это работает, потому что UTF-8 был разработан как можно более прозрачный, чтобы код уже обрабатывал ASCII, и потому что ваш выходной терминал поддерживает UTF-8 – nos

1

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

+0

Примечание: '\ 0' буквально является восьмеричным числом 0 с типом символа. Итак, да, завершающий символ всегда буквально равен 0. –

+0

@Martin: спасибо, что указали это. Я всегда забываю, применяются ли странные правила вокруг нулевых указателей к нулевым символам. –

+0

@Martin: Технически тип символьного литерала - 'int' (по крайней мере, он находится на C) ... –

6

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

+0

На самом деле большинство современных ОС используют широкую строку символов во всех внутренних интерфейсах (Win/Linux/Mac). Таким образом, это не ASCII, который они используют. –

+0

Я не сказал, что они используют ASCII по умолчанию в своих интерфейсах, но что они не могут использовать ASCII :) – fresskoma

+0

«на самом деле у него нет никакой кодировки». В цифровом сохраненном тексте всегда есть некоторая кодировка. – Praxeolitic

1

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

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

Смежные вопросы