Проблема с русскими символами

#include <stdio.h>

int main()
{
    char *msg = "Не звони мне";
    puts(msg+3);
    return 0;
}

По идее, вывод должен быть "звони мне", но выводится "� звони мне". Единственное логичное объяснение, которое я нашёл, это то, что русские символы занимают 2 байта, и потому "Не" и пробел будет 5 байтов puts(msg+5);. Разве этим не должен заниматься компилятор?


Ответы (1 шт):

Автор решения: AlexGlebe

В Си массивы имеют только фиксированные размеры элементов. В строках или по байту или по два байта. А UTF-8 имеет плавающий размер (1-6) байт. Если вам нужны точная фиксация элементов строки , то придётся пользоваться wchar_t со всеми вытекающими функциями конвертации.

// gcc -Wall -std=c11 -Wextra dontring.c -o dontring
# include <stdio.h>
# include <wchar.h>
# include <locale.h>
int main()
{
  setlocale(LC_ALL,"");
    wchar_t const msg[] = L"Не звони мне";
    fputws(&(msg[3]),stdout);
    return 0;
}

вывод :

> ./dontring 
звони мне
→ Ссылка