Технически, C89 не поддерживает многобайтовое кодирование для строки литералов (только ASCII), стандартные функции C могут обрабатывать ввод / вывод с другими кодировками, при условии, что они могут рассматриваться как непрозрачный большой двоичный объект.
Например, это будет правильно:
#include <stdio.h>
int main() {
printf("%s\n", "\xe3\x81\x82\xe3\x81\x82");
}
Этот может быть неправильным (если вы ожидаете, что он напечатает количество символов):
#include <stdio.h>
#include <string.h>
int main() {
printf("%lu\n", strlen("\xe3\x81\x82\xe3\x81\x82"));
}
Компилятор может интерпретировать ввод источника как UTF-8, но это не гарантируется. Например, GCC, похоже, правильно читает исходные файлы UTF-8:
hexdump -Cv b.c
00000000 23 69 6e 63 6c 75 64 65 20 3c 73 74 64 69 6f 2e |#include <stdio.|
00000010 68 3e 0a 69 6e 74 0a 6d 61 69 6e 28 29 0a 7b 0a |h>.int.main().{.|
00000020 20 20 20 20 70 72 69 6e 74 66 28 22 25 73 5c 6e | printf("%s\n|
00000030 22 2c 20 22 e3 81 82 e3 81 82 22 29 3b 0a 7d 0a |", "......");.}.|
00000040
Обратите внимание, что та же строка является литералом (e3 81 82 e3 81 82
) и точно такой же последовательностью байтов, которая выводится на печать:
./a.out | hexdump -Cv
00000000 e3 81 82 e3 81 82 0a |.......|
00000007
Если ваша локаль не UTF-8, или ваш редактор сохранил файл с кодировкой, отличной от UTF-8, я подозреваю, что результат будет другим.