0

Помогите пожалуйста разобраться. У меня есть простой код, в качестве аргумента командной строки подаю "Привет".

#include <stdio.h>
#include <tchar.h>
#include <Windows.h>
#include <locale.h>

int _tmain(int argc, TCHAR* argv[]) { TCHAR buf[100];

_fgetts(buf, 100, stdin);

_tprintf(TEXT(&quot;\nargv[1] %s\n&quot;), argv[1]);
_tprintf(TEXT(&quot;%s\n&quot;), buf);

}

В консоль я пишу "Мир" и вижу следующий результат:

введите сюда описание изображения

Если добавить setlocale(LC_ALL, ""), то результат уже вот такой:

введите сюда описание изображения

Как мне корректно вывести обе строки? _setmode(_fileno(stdout), _O_U16TEXT) тоже пробовал. Использую VS 2015, в насторйкай стоит Use unicode characters.

tproger
  • 11
  • А посмотрите, определено ли у вас UNICODE и _UNICODE (это две разные штуки). – VladD May 13 '17 at 10:54
  • _setmode должно работать: https://ru.stackoverflow.com/a/459299/10105. Попробуйте рецепт из того ответа. – VladD May 13 '17 at 10:56
  • А файл вы сохранили как unicode? – VladD May 13 '17 at 10:56
  • Причём тут файл? Локаль не установлена может быть. – 0andriy May 13 '17 at 11:17
  • @0andriy: А вы пробовали на английской системе открыть cpp-файл с кириллическими символами, сохранёнными не как Unicode? Попробуйте. – VladD May 13 '17 at 11:21
  • Я по коду в упор не вижу каким образом это релевантно к вопросу, извините. – 0andriy May 13 '17 at 11:24
  • Автору. Посмотрел ещё раз на вопрос. Короче, две ошибки мне кажется тут. Как вы правильно заметили, нужно выставлять локаль, а вторая (похоже!) в банальном двойном перекодировании. _fgetts() по-видимому возвращает C строку, а вы ещё по ней _tprintf()'ом. – 0andriy May 13 '17 at 11:29
  • @tproger: А вы делали setmode только для stdout или для stdin тоже? – VladD May 13 '17 at 13:00
  • @VladD Простите, что отвечаю через столько много времени, я использовал setmode только на stdout. Вы правы, добавил недостающие setmode и все заработаботало, спасибо) – tproger Sep 01 '17 at 13:18
  • @tproger: Вот и отлично! Одной загадкой меньше. – VladD Sep 01 '17 at 16:30

1 Answers1

1

TCHAR - это универсальный char. Который, определён как:

#ifdef _UNICODE
typedef wchar_t TCHAR;
#else
typedef char TCHAR;
#endif

Что это значит? Это значит, что всё зависит от настроек проекта.

Посмотрите, что вы выставили, вот тут.

unicode

Макрос _UNICODE будет включен если вы укажите «Use Unicode Character set» и тогда тип TCHAR будет определен как wchar_t. Когда же вы укажите «Use Multi-byte character set» TCHAR будет определен как char.

Anon8
  • 695