3

В проекте исходные файлы в UTF8 кодировке, в коде есть русский текст подаваемый на вывод в консоль. Компилирую MS компилятором. ОС windows 7. В консоль выводятся не все буквы.

Тестовый код:

#include <iostream>
#include <windows.h>

using namespace std;

int main(){
    SetConsoleCP(65001);
    SetConsoleOutputCP(65001);

    cout << "Передача" << endl;

    return 0;
}

вывод в консоль:

out

perfect
  • 10,021
  • (1) Виндушная консоль вроде не очень хорошо поддерживает utf-8. Почему бы вам не воспользоваться решением отсюда? (2) А другие заглавные буквы? Может, проблема в шрифте? (3) А если строку вывести ещё раз? Проблемой может быть BOM. – VladD Jul 08 '16 at 11:50
  • @VladD здравствуйте. (1) работаю в QtCreator он cp1251 не понимает, предлагаемое решение не помогло, самое странное что на windows xp с этим проблем не было она нормально отображала utf8 (2) малая прописная буква п так же как и заглавная не отображается, шрифт выставлен правильно lucida console (3) попробовал с BOM и без него результат одинаковый. (4) Помогает только перекодировка исходника в cp1251 но QtCreator не дает редактировать такие файлы. – perfect Jul 08 '16 at 12:09
  • (1) Но предложенное решение вроде бы рекомендует utf-16, а не 1251. Попробуйте таки utf-16 + wstring + wcout. (2) Окей, а если буква п не в начале слова, то как? (3) Жалко, думал, что проблема в этом – VladD Jul 08 '16 at 12:32
  • @VladD (1) попробовал и в UTF-16 получил на выходе белеберду –ü–µ—Ä–µ–¥–∞—á–∞ (2) если буква п не в начале то все хорошо нормально отображается. – perfect Jul 08 '16 at 12:47
  • Хм. Странно, а вы точно выполнили заклинание с _setmode? Без него работать не будет. – VladD Jul 08 '16 at 12:48
  • @VladD с заклинанием _setmode в вывод вообще ничего не падает просто мигающий курсор и на этом тишина, я на UTF-16 переключал при помощи функций SetConsoleCP(10000); SetConsoleOutputCP(10000); – perfect Jul 08 '16 at 12:54
  • Уфф. С Visual Studio заклинание работает, так что вопрос тут к спецам по Qt Creator'у, какими заклинаниями можно заставить его правильно работать с консолью. Сорри, я пытался помочь, у меня не вышло. // То, что портится только первая буква, всё же намекает на проблему с BOM. Может быть, Qt-шный код, управляющий консолью, глючит или требует каких-то других заклинаний? – VladD Jul 08 '16 at 12:59
  • в свежих версиях QtCreator (как собсвтенно и в сорцах Qt) принята по умолчанию нормальная кодировка - utf-8. А вот проблема с первым символом сильно похоже на проблему винды. Когда она не знает кодировку, она пытается ее угадать. А угадайка работает очень плохо. – KoVadim Jul 08 '16 at 13:43

1 Answers1

1

Решение для тех кто пользуется QtCreator (моя версия 3.6.0) под windows 7 с MS компилятором. Что бы QtCreator мог редактировать файлы в CP 1251 кодировке , заходим инструменты->параметры->текстовый редактор->поведение->кодировки файлов->по умолчанию и ставим значение CP1251(windows). Затем если у вас файлы в другой кодировке преобразуем их в кодировку cp1251 с помощью любой доступной утилиты, перезапускам QtCreator и на этом вроде бы все.

настройки

код:

#include <iostream>
#include <windows.h>

using namespace std;

int main(){
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    cout << "Передача" << endl;

    return 0;
}

вывод:

result

perfect
  • 10,021
  • CP 1251 кодировке (именно эту кодировку использует windows 7 как родную) я бы так не сказал. Вообще то родная кодировка - это utf-16, а cp1251 и 866 - пережитки прошлого. Внутри ядра ОС cp1251 используется только для перекодировки в utf-16, если они пришли от пользователя. – KoVadim Jul 08 '16 at 13:28
  • @KoVadim возможно вы правы просто я считал что та кодировка которая по умолчанию в консоли та и родная, мне вообще по команде chcp выдавала кодировку CP866 ) . спасибо, сейчас поправлю – perfect Jul 08 '16 at 13:32
  • @KoVadim, имелась в виду кодировка для неюникодных программ. – Qwertiy Jul 08 '16 at 13:58
  • @perfect, в консоли родная досовская кодировка - 866 как раз. – Qwertiy Jul 08 '16 at 13:58
  • Для не юникодных программ кодировка задается в настройках. При установке системы о ней как раз и спрашивается. Да, для неконсольных приложений, которые не поддерживают юникод скорее всего будет cp1251, а в Европе скорее будет cp1252. – KoVadim Jul 08 '16 at 14:01
  • @Qwertiy пофиксил разногласие, теперь буду знать что ядро написано на utf-16 а локаль досовская – perfect Jul 08 '16 at 14:09