Вывод кириллицы в консоли
Наиболее простой способ - изменить кодировку исходников (например в редакторе notepad++ editpad и т.д.).
Проект полностью создается в Dev-C++ 5.2.0.0. Пытался делать его в Юникод, но не нашёл в Dev-C++ такой возможности.
Это я знаю, но гимор то какой!
Это если пару десятков строк - ещё куда не шло
Жутко гиморно. Пробовал уже. Это когда пару тройку строк надо - нормально, конечно.
Я то конечно отдельной цункцией пользуюсь, но рано или поздно это может привести к какому-нибудь косяку. Хотелось бы чтобы без фантазий. И, даже кажется, был такой способ, но вспомнить не могу.
А проблем с вводом русских букв у меня нет. Или имеется ввод и запись куда-нибудь?
#include <iostream>
#include <windows.h>
/*
OemToChar() для возвращаемого из cin
*/
using namespace std;
int main()
{
setlocale(0, "rus");
char str[80];
cout << "Введите строку\n";
cin >> str;
OemToChar(str, str);
cout << "Введена str: " << str << endl;
return 0;
}
А Вам может поможет материал с этого сайта, где обсуждалась эта проблема (здесь). Возможно у Вас сработает ф-ция SetConsoleCP(1251).
#include <iostream>
using namespace std;
int main() {
setlocale(LC_ALL, ".OCP");
wchar_t prompt[21] = L"Введите строку...";
wstring wstr;
wcout << prompt << endl;
wcin >> wstr;
wcout << L"Введено: " << wstr;
return 0;
}
#include <iostream>
using namespace std;
int main() {
setlocale(LC_ALL, ".OCP");
char prompt[21] = "Введите строку...";
wstring str;
wcout << prompt << endl;
wcin >> str;
wcout << "Введено: " << str;
return 0;
}
#include <clocale> //для std::setlocale()
int main()
{
std::setlocale(LC_ALL, "");
std::wcout << L"Привет, мир!" << std::endl;
}
[Error] Illegal byte sequence
Error 1 (if this is the only error: please check your library includes)
Почему?
А как Вы в Code::Blocks в UTF переводите?
Хотя, конечно, это гиморно очень. GCC что-то ни один способ, кроме написания отдельной функции, не принимает. А хочется универсальности под любой компилятор и поменьше букововк в коде
единообразно изкаропки это не будет.
Если такое нужно - значит надо пользоваться допбиблиотеками - например Qt
Нормально всё "кириллизуется" через использование setlocale(LC_ALL, ".OCP") и std::wcout.
Но вот есть строка
const string x = = "Привет, " + name + "!";
, на которой этот вроде бы рабочий костыль вылетает (т.е. выводятся опять кракозябры). Т.е.
std::wcout << x;
не выводит кириллицы.
Что-нибудь несложное можно придумать?
Да нет - не помогло :(
#include <stdexcept>
#include <windows.h>
#include <string>
#include <vector>
using namespace std;
// Перекодировщики из cp1251 в 866 и обратно функциями WinAPI: CharToOem() и OemToChar()
namespace details {
template<class Func>
inline std::string converter(const std::string &text, Func func)
{
std::vector<char> buffer(text.size() + 1);
if ( !func(text.c_str(), &buffer[0]) )
throw std::runtime_error("Invalid character");
return std::string(buffer.begin(), buffer.end() - 1);
}
}
//namespace details
std::string ansiFromOem(const std::string &text)
{
return ::details::converter(text, &OemToCharA);
}
std::string oemFromAnsi(const std::string &text)
{
return ::details::converter(text, &CharToOemA);
}
int main()
{
string name;
cout << oemFromAnsi ("Введите Ваше имя: ");
cin >> name;
cout << endl;
// Если name не обработать с помощью ansiFromOem, то значение name отобразится кракозябрами
string greeting = "Привет, " + ansiFromOem(name) + "!";
cout << oemFromAnsi(greeting);
return 0;
}
#include <iostream>
#include <cstdio>
#include <clocale>
#include <string>
using namespace std;
int main() {
setlocale(LC_ALL, ".OCP");
wchar_t prompt[] = L"Введите слово: ";
wstring wstr;
wcout << prompt;
wcin >> wstr;
wcout << L"Введено: " << wstr << endl << endl;
wstring wstr1 = L"Введите ваше имя: ";
wcout << wstr1;
wstring n;
wcin >> n;
wstring ans = L"Привет, " + n + L"!";
wcout << ans << endl << endl;
wchar_t str [80];
wprintf (L"Введите слово: ");
wscanf (L"%s", str);
wprintf (L"Введено: %s\n", str);
return 0;
}
using namespace std;
int main() {
#ifdef LINUX_CON
setlocale(LC_ALL, ""); //системная
#else
setlocale(LC_ALL, ".OCP");//OEM
#endif
.........
и т.д.,как ранее
То же верно и для использования такой русификации:
SetConsoleOutputCP(1251);
#include <windows.h>
#include <iostream>
#include <cstdio>
//При использовании функций настройки консоли русские буквы будут отображаться
//правильно, если для консольного окна выбран шрифт Lucida Console. Для выбора
//шрифта нужно щелкнуть правой кнопкой мыши по заголовку окна, выполнить команду
//Свойства, а затем на вкладке Шрифт выбрать нужный шрифт.
//По материалу статьи:
//"Локализация консольных приложений в языке С++" В.Л.Тарасов
using namespace std;
int main() {
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
char Name[100];
cout << "Имя: ";
cin >> Name;
cout << "Привет, " << Name << endl;
printf("Имя: ");
scanf("%s", Name);
printf("Привет, %s\n", Name);
getchar();
}
//Работает, если шрифт в консоли Lucida Console
#include <iostream>
#include <cstdlib> //для system
#include <cstdio>
using namespace std;
int main()
{
system("chcp 1251 > nul");
char str[200];
cout << "Имя: ";
cin >> str;
cout << "Привет, " << str << endl;
printf("Имя: ");
scanf("%s", str);
printf("Привет, %s\n", str);
getchar();
return 0;
}
Хотелось бы знать механизм её работы.