Как печатная строка utf-8 печатается на экране C с помощью printf?

Для кода ниже в C:

char s[] = "这个问题";
printf("%s", s);

Знал, что исходный файл - это "текст программы UIF-8 Unicode C" с помощью команды file.

Как строка кодируется после компиляции? Также utf-8 в .out файле?

Когда двоичный файл выполняется в bash, как строка закодирована в памяти? Это также utf-8?

Затем, как bash знает схему кодирования и показывает правильный символ?

Наконец, теперь bash знает, что показывать, но как байты переводятся на пиксели на экране? Есть ли какое-то отображение от байтов до пикселей?

Во всех этих процессах существует ли какая-либо кодировка или декодирование utf-8?

Ответ 1

Предполагая, что GCC, эта страница руководства говорит, что препроцессор сначала переводит набор символов входящих файлов в так называемый исходный набор символов, который для gcc является UTF-8. Поэтому для файла UTF-8 ничего не происходит. По умолчанию используется набор символов исполнения по умолчанию для строковых констант, и по умолчанию это (опять же, для GCC) UTF-8.

Итак, ваша строка UTF-8 "выживает" и существует в исполняемом файле как куча байтов в кодировке UTF-8.

Терминал также имеет набор символов, и он должен соответствовать, программа C ничего не делает для дальнейшего перевода строк при печати, они просто печатаются так, как они есть, байт для байта. Если терминал не настроен для UTF-8, вы просто получите мусор.

Как я заметил в комментарии, bash не имеет к этому никакого отношения.