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

Это русская секция форума wxWidjets. В этой секции вы можете обсуждать любые вопросы, связанные с wxWidgets на вашем родном языке.
Post Reply
Armann
In need of some credit
In need of some credit
Posts: 3
Joined: Sat May 23, 2009 2:48 pm

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

Post by Armann » Sat May 23, 2009 3:29 pm

Добрый день.
Есть в наличии 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;

van_user
Experienced Solver
Experienced Solver
Posts: 55
Joined: Wed Jun 11, 2008 9:28 pm
Location: UA

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

Post by van_user » Mon May 25, 2009 5:33 am

Armann wrote: wxUSE_UNICODE установил в 1
Попробуй в UNICODE :).

borr_1
Super wx Problem Solver
Super wx Problem Solver
Posts: 362
Joined: Wed Mar 07, 2007 8:10 am
Location: Russia, Shakhty

Post by borr_1 » Mon May 25, 2009 5:45 am

Вот 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, а то не соберет)

Armann
In need of some credit
In need of some credit
Posts: 3
Joined: Sat May 23, 2009 2:48 pm

Post by Armann » Tue May 26, 2009 3:19 pm

спасиб, время будет - опробую

Armann
In need of some credit
In need of some credit
Posts: 3
Joined: Sat May 23, 2009 2:48 pm

Post by Armann » Tue May 26, 2009 5:15 pm

наконец дочитал до нужной страницы "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;
Работает так как мне хочется

Post Reply