LINUX.ORG.RU

Не удается вывести в терминал кириллицу

 , , ,


0

1

Linux Mint из коробки, (думаю ОС не причем) при попытке скомпилировать данный пример - результат знаки вопроса.

#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <wchar.h>
#include <wctype.h>

int printfun(const wchar_t *s) {
    fwprintf(stdout, L"%ls\n", s); // запасной вариант
    fprintf(stdout, "%ls\n", s); // вариант №1
}

int main (int argc, char** argv) {
    const wchar_t *t = L"сегодня интересный день"; // если поменять на char* то все работает
    printfun(t);
    return 1;
}
gcc test.c && ./a.out 
??????? ?????????? ????

#include <locale.h>
(void)setlocale(LC_ALL, ""); // в начало main()

fwprintf(stdout, L"%ls\n", s); // запасной вариант
fprintf(stdout, «%ls\n», s); // вариант №1

Смешивать нельзя, поток работает только в одном режиме (narrow/wide).

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

У меня схожий вопрос в голове завалялся:
почему этот код выводит вопросы (локаль ru_RU.utf8):

#include <iostream>
#include <locale>
int main()
{
  std::wcout.imbue(std::locale(""));
  std::wcout << L"Привет\n";
}
// out: ??????
Установка локали глобально решает проблему, но ведь и так должно работать, нет?

pavlick ★★ ()
Ответ на: комментарий от pavlick

С этим работает:

std::wcout.sync_with_stdio(false);

Насколько я вижу, при синхронизации весь вывод wcout заворачивается на cout, что приводит к «сужению» символов в соответствующию локаль, отсюда такой странный эффект. Детальные причины мне самому не ясны, я не нашёл источников и смотрел по исходникам.

xaizek ★★★★★ ()
Ответ на: комментарий от xaizek

Спасибо. А я пробовал wcout.sync_with_stdio(false) после imbue, ничего не получалось (в отличии от до imbue). Ну тогда хоть какая-то логика есть.

pavlick ★★ ()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.