Меню
Категории
Вывод русских букв в консольных приложениях на C++
19 февраля, 2008 Программинг

Компилируя консольные приложения на славном языке программирования C++ постоянно сталкиваешься с проблемой кодировок. Русские буквы выводятся каракулями, а с английскими все в порядке. Дело в кодировках. В консоли Windows используется кодировка OEM. А в самой ОС Windows – ANSI кодировка.

Для избежания проблем с выводом русских букв в консоль мы будем пользоваться функцией CharToOem.

Функция CharToOem преобразует строку в набор символов ОЕМ. Эта функция противоположна функции AnsiToOem.

BOOL CharToOem (
LPCTSTR lpszSrc , // указатель на преобразуемую строку
LPSTR lpszDst // указатель на буфер для преобразованной строки
);

Параметры

lpszSrc – указывает на завершающуюся нулем преобразуемую строку.
lpszDst – указывает на буфер для преобразованной строки. Если CharToOem используется как ANSI -функция, то можно установить параметр lpszDst на тот же адрес, что и параметр lpszSrc . Это не может быть осуществлено в случае использования CharToOem как Unicode -функции.

Пример ниже показывает вывод русских букв в консоль. Для этого нужно подключить библиотеку “windows.h”. Функция CharToOem выполняет преобразование.

Преобразование нужно проводить только для вывода на экран, для вывода в файл или внутренней работы с переменными это делать не нужно.

#include <windows.h> //нужна для функции CharToOem

void main()
{

char buf[10];
char str[10]=”qwertyuiop”;
CharToOem(str, buf); //преобразование
cout<<buf<<endl;
delete[] buf; //Больше нам массив buf не нужен.
}

Вот и всё.

42 комментария
  1. Прохожий

    #include
    #include

    using namespace std;
    int main()
    {
    setlocale( LC_ALL, “Russian” );

    cout << "Типа привет\n";
    return 0;
    }

  2. Аргумент типа char* несовместим с параметром типа LPCWSTR.
    Вот какую байду выдаёт VS C++ 2010 (на CharToOem)
    При попыкте перевести типы, даёт ошибку (фатальную)

    Кстати, setlocale( LC_ALL, «Russian» ); работает только на вывод, а на ввод – нет.

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

    using namespace std;
    int main()
    {
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);

    cout << "Привет, мир!" << endl;
    return 0;
    }

  4. а можно просто в начале функции main написать следующее:
    std::locale::global(std::locale(“.1251”));

  5. Комментарий от impeller (дополняю ваш комментарий)
    перед тем как писать функцию
    setlocale( LC_ALL, “Russian” )
    подключите библиотеку #include

  6. Друзья, лучший из комментариев –
    //// специально для вывода русских букв
    // setlocale(LC_ALL,”Russian”);
    // cout << "Лучший из всех !!!";

    Спасибо большое "я тут мимоходом [ Октябрь 23, 2009, 23:27 ]"

  7. Steiner, спасибо Вам огромное! Ваш метод очень помог мне! К тому же он самый короткий и простой! А я всё с функциями CharToOem() OemToChar() мучался!

  8. // Файл тестировался в интегрированной среде разработке C++ Builder 2009
    //—————————————————————————
    #pragma hdrstop

    #include
    #include
    #include
    #include
    #include
    //—————————————————————————

    #pragma argsused

    char * RU(char * s); // прототип функции, реализация ниже
    char * RU_T(char * s); // прототип функции, реализация ниже
    //int strcmp(char * s, char * t); // прототип функции, реализация ниже

    int _tmain(int argc, _TCHAR* argv[])
    {
    int var;
    char * buffer;

    var = 155;
    printf( RU(“\”Говорит\” frintf\n\n”) );
    cout << RU("\"Говорит\" cout\n\n");
    printf(RU("printf: Переменная var = %d\n\n"), var);
    cout << RU("cout: Переменная var = ") << var << "\n\n";
    buffer = RU("переменная buffer в printf: Консоль \"понимает\" русские буквы\n\n");
    printf(buffer);
    buffer = RU("переменная buffer в cout: Консоль \"понимает\" русские буквы\n\n");
    cout << buffer;

    cout <> buffer;

    RU_T(buffer); // Перекодирует строку для сравнения с образцом

    if ( strcmp(“Любовь”, buffer) == 0 )
    cout << RU("\nПравильно, вы ввели: ") << RU(buffer);
    else
    cout << RU("\nНеверно, вы ввели: ") << RU(buffer);

    cout <=-64 && s<=-17)
    s = char(s+64+128);
    else if(s=char(-64+64+128) && s<=char(-17+64+128))
    s = s – char(64+128);
    else if (s<char(64+176))
    s = s – char(64+176);
    else
    s = s;
    return s;
    }
    //—————————————————————————
    // strcmp: выдает < 0 при s 0 при s > t
    //int strcmp(char * s, char * t) // реализация функции
    //{
    // for ( ; *s == *t; s++, t++)
    // if (*s == ”)
    // return 0;
    // return *s – *t;
    //}

  9. Листинг ввёлся как-то коряво ….

  10. Для вывода русских букв добавляем в тело программы
    setlocale(0, “”);

  11. Для Windows 8.1 и MS Visual Studio 2013 Pro прилагаемая программа выводит русский текст, как набранный в редакторе VS 2013, так и введенный в режиме работы программы, т.е. в режиме DOS:

    #include “stdafx.h”
    #include

    using namespace std;

    int _tmain()
    {
    setlocale(LC_ALL, “.1251”); // Для вывода текста набранного в редакторе VS 2013
    char * str = “Вывод русского текста из строки!”; // иницализируем строку
    cout << str << endl; // теперь выводим нашу строку на экран
    cout << "введи что-нибудь по-русски" <> s;
    cout << s << endl;
    system("PAUSE");
    return 0;
    }

    // и никаких ChatToOem

Добавить комментарий




*