Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C++ Builder > Проблема с русскими буквами


Автор: vladd 5.6.2012, 08:55
Пишу на C++ Bulder 6 в консоли. Для вывода на экран русских букв использую код
Код

 //Руссификация
   ostream& operator<<(ostream &stream,char* s){
        for(char* ps=s; *ps; ps++){
                if(*ps=='ё')
                        stream<<char(241);
                else if(*ps=='Ё')
                        stream<<char(240);
                else if(*ps>=-64 && *ps<=-17)
                        stream<<char(*ps+64+128);
                else if(*ps<0)
                        stream<<char(*ps+64+176);
                else
                        stream<<*ps;
        }
        return stream;
}

Работает правильно. Но вот когда пишу в консоли русский текст, присваиваю его переменной а потом вывожу на экран получаю кракозябры.
Что нужно сделать чтобы выводило нормальный русский текст?
Я так понимаю что проблема при считывании  русских букв с экрана.

Автор: artsb 5.6.2012, 09:34
Почему бы не воспользоваться setlocale()?
Код

setlocale(LC_ALL, "Russian");

Автор: vladd 5.6.2012, 09:57
Это 
Код

setlocale(LC_ALL, "Russian");

у меня даже на консоль вместо русских букв выдает кракозябры.
У меня Borland C++ Bulder Enterprise Suite Version 6.0(Build 10.155)

Автор: artsb 5.6.2012, 10:38
Цитата(vladd @  5.6.2012,  09:57 Найти цитируемый пост)
у меня даже на консоль вместо русских букв выдает кракозябры.

Эта строчка должна быть прописана в самом начале программы.
У меня раньше работало и сейчас работает. И под VS и под RADStudio. К сожалению, нет BCB6, чтобы проверить.

Добавлено через 11 минут и 34 секунды
Попробуйте ещё:
Код

setlocale(LC_ALL, "russian_russia.1251");

Или:
Код

#include <windows.h>
// ...
SetConsoleOutputCP(1251);
SetConsoleCP(1251);

Или же используйте WideChar:
Код

setlocale(LC_ALL, "");
wprintf(L"тест");

Автор: vladd 5.6.2012, 11:02
Я вставлял все это в класс main
Код

 int main (void)
{
   setlocale(LC_ALL, "");
   wprintf(L"тест");
 while (Menu ()); // Цикл пока пользователь не выбрал выход
    Clear ();
     return 0;
    }

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

Автор: vladd 5.6.2012, 11:48
Код

setlocale(LC_ALL, "");
   wprintf(L"тест");


Вот этот код вроде выдает русские символы в консоль. Но появилась следующая проблема. Есть строка вывода текста в консоль такого вида 
Код

cout << i << ". " << pacient->Bolnoy << "|   |"<< pacient->Doctor << "|    " << pacient->Age << "|     " << pacient->Diagnoz<<"|      "<< pacient->Otdelenie << "|       |" << endl;
 
где pacient - это структура. Как эта строка должна выглядеть через  wprintf(L" ");Дошел до этого 
Код

wprintf(i " ." L  ));
 
А дальше как не знаю. Постоянно идут ошибки.Прошу помощи.

Автор: LeonidPr 5.6.2012, 11:50
У меня на BCB5 работает правильно.

Автор: artsb 5.6.2012, 12:29
Код

wcout << i << L". "
 << pacient->Bolnoy   << L"|   |"
 << pacient->Doctor   << L"|    "
 << pacient->Age       << L"|     "
 << pacient->Diagnoz <<L"|      "
 << pacient->Otdelenie << L"|       |" << endl;

Автор: vladd 5.6.2012, 13:08
Спасибо большое за помощь. Но все равно не хочет писать по русски. Снимок экрана.user posted image 
Пошли цифры теперь.

Автор: vladd 5.6.2012, 13:39
Вот еще один снимок. Он показывает что не правильно считывается фамилия петров с экрана.

user posted image

Автор: vladd 5.6.2012, 16:02
Для получения русских букв у меня получился вот такой код
Код

#include <clx.h>
#pragma hdrstop
#pragma argsused
#include <iostream>
#include <locale>
#include <string>
using namespace std;
  
 //Руссификация
  ostream& operator<<(ostream &stream,char* s){
        for(char* ps=s; *ps; ps++){
                if(*ps=='ё')
                        stream<<char(241);
                else if(*ps=='Ё')
                        stream<<char(240);
                else if(*ps>=-64 && *ps<=-17)
                        stream<<char(*ps+64+128);
                else if(*ps<0)
                        stream<<char(*ps+64+176);
                else
                        stream<<*ps;
        }
        return stream;
}

int _tmain(int argc, _TCHAR* argv[])
{

string str1;
cout << "Введите строку: ";
getline(cin, str1);
cout << "Вы ввели: ";
cout << str1 << endl;
system("pause");
return 0;
}


А теперь кто подскажет. Для заполнения структуры я использовал такую строку
Код

 cin >> pacient->Bolnoy;
 
Теперь имею строку
Код

getline(cin, str1);

Вопрос. Как мне теперь заполнить структуру pacient значением  Bolnoy и другими?

Автор: artsb 5.6.2012, 16:35
А если
Код

std::wcin >> pacient->Bolnoy;

Автор: vladd 5.6.2012, 17:01
Спасибо. Но мой компилятор ругается. Выдает такую ошибку 
Код

[C++ Error] Unit1.cpp(148): E2015 Ambiguity between '_STL::basic_istream<wchar_t,_STL::char_traits<wchar_t> >::operator >>(bool &)' and 

'_STL::basic_istream<wchar_t,_STL::char_traits<wchar_t> >::operator >>(void * &)'

Что то с чем то не соответствует.

Автор: artsb 5.6.2012, 18:21
Цитата(vladd @  5.6.2012,  17:01 Найти цитируемый пост)
Выдает такую ошибку 

На какой строке?

У меня работает:
Код

typedef struct _SS
{
    wchar_t buf[100];
    int i;
    bool b;
} SS, *PSS;

int _tmain(int argc, _TCHAR* argv[])
{
    SS s;
    PSS p;

    p = &s;

    setlocale(LC_ALL, "");
    // string
    std::wcout << L"Input string: ";
    std::wcin >> p->buf;
    std::wcout << std::endl;
    // int
    std::wcout << L"Input int: ";
    std::wcin >> p->i;
    std::wcout << std::endl;
    // bool
    std::wcout << L"Input bool: ";
    std::wcin >> p->b;
    std::wcout << std::endl;

    // result
    std::wcout << L"Result string: " << p->buf << std::endl;
    std::wcout << L"Result int: " << p->i << std::endl;
    std::wcout << L"Result bool: " << p->b << std::endl << std::endl;

    system("pause");

    return 0;
}

Автор: vladd 5.6.2012, 18:39
У меня ругается на строке
Код

int _tmain(int argc, _TCHAR* argv[])


Выдаёт ошибку 
Код

E2303 Type name expected


Добавлено через 3 минуты и 7 секунд
Подключил библиотеки.Перестал ругатся.

Добавлено через 5 минут и 18 секунд
но на консоли кроме Нажмите на любую клавишу.... больше ничего.

Добавлено через 8 минут и 33 секунды
Добавил строку. Пишет цифрами.  
cout << L"Введите строку: ";

Автор: vladd 5.6.2012, 18:54
Если писать std::wcout то на консоли ничего нет. Если std::cout то появляются цифры.

Автор: artsb 5.6.2012, 19:24
Цитата(vladd @  5.6.2012,  18:39 Найти цитируемый пост)
Добавил строку. Пишет цифрами.  
cout << L"Введите строку: "; 

Для Юникода Wcout:
Код

wcout << L"Введите строку: ";

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)