Page 1 of 1

WinXP, консоль и кодировка

Posted: Sat May 23, 2009 3:29 pm
by Armann
Добрый день.
Есть в наличии WinXP rus со всеми обновлениями, wxDev 7.0 RC5, компилятор minGW 3.4.5, wxWidgets версии 2.8.10

Есть вот такая консольная программка:

Code: Select all

#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
    cout << "Привет" << endl;
    system("PAUSE");
    return EXIT_SUCCESS;
}
На выводе вместо Привет получаю абракадабру, как будто вывожу в другой кодировке. Проверил файл с текстом программы (main.cpp) - текст там в кодировке win1251.
wxWidgets сначала была 2.8.9, потом скачал 2.8.10 и скомпилил - аналогично. В скаченной 2.8.10 в файле \..\wxWidgets-2.8.10\include\wx\msw\setup.h
wxUSE_UNICODE установил в 1 (вроде бы добавил поддержку юникода:)), перекомпилил библиотеку - все едино. Пробовал играться с wxEncodingConverter - на выходе или другая абракадабра, или пустая строка.
Последний раз писал на Сях (правда BC++ и MSVC) лет пять назад, и не припомню таких проблем.
Что я делаю не так? Подскажите плиз. Или в открытую дверь ломлюсь?

UPD. Сохранил файл в кодировке DOS, скомпилил - получил свой Привет. Причину понял, возник такой вопрос - как правильно сконвертировать строчку с кодировки Win (1251) в DOS (866)? С нижеприведенного кода получаю пустую строчку

Code: Select all

  wxEncodingConverter cnv;
  cnv.Init(wxFONTENCODING_CP1251, wxFONTENCODING_CP866);
  
  wxString str1 = "Привет";
  wxString str2;

  str2 = cnv.Convert(str1);
  cout << str2 << endl;

Re: WinXP, консоль и кодировка

Posted: Mon May 25, 2009 5:33 am
by van_user
Armann wrote: wxUSE_UNICODE установил в 1
Попробуй в UNICODE :).

Posted: Mon May 25, 2009 5:45 am
by borr_1
Вот t-Rex пример давал

Code: Select all

wxString testStr = _("Превед медвед!");
    wxCSConv conv(wxT(”cp-866″));
    int len = testStr.Length()+1;
    char * asciistr = new char[len];
    memset(asciistr, 0, len);
    if(conv.WC2MB(asciistr, testStr.GetData(), len) != wxCONV_FAILED)
    {
        MessageBoxA(0, asciistr, "Yo!", 0);
    }
    else
    {
        wxMessageBox(_("Ппц! Нифига не получи лося!"));
    }
    delete [] asciistr;
wxUSE_UNICODE установил в 1
Тогда не забывай тег wxT перед текстом см пример и файлы твоего проекта переведи в UTF-8 кодировку (для MinGW, а то не соберет)

Posted: Tue May 26, 2009 3:19 pm
by Armann
спасиб, время будет - опробую

Posted: Tue May 26, 2009 5:15 pm
by Armann
наконец дочитал до нужной страницы "Cross-Platform GUI Programming with wxWidgets" :)
решение получилось такое:

Code: Select all

    wxString text(wxT("Привет"));
    
    wxCSConv convFrom(wxT("cp-1251")); 
    wxCSConv convTo(wxT("cp-866")); 
    
    text = wxString(text.wc_str(convFrom), convTo) ;    
    cout << text << endl;
Работает так как мне хочется