Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > MS VisualC++ не говорит по русски


Автор: shara 3.10.2008, 00:24
работаю в Visual C++  при помощи конструктора нарисовал окошко в него вставил элемент типа EditControl, и хочу выводить в нее текст. все вроде бы хорошо, и русский текст понимает если начальное значение строки текста задавать в коде программы.
проблемы начинаются если читать текст из файла(созданного при помощи блокнота) и затем пытаться его вывести

Код

HANDLE hFile;

hFile = CreateFile(_T("d:\\test\\2.txt"), GENERIC_READ, 0,  NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    
    int bResult
    DWORD nBytesRead=0;
        const int N_SIZE=30;
       char rBuf[N_SIZE]="";
    
    bResult = ReadFile(hFile, rBuf, N_SIZE, &nBytesRead, NULL);
    rBuf[N_SIZE]='\0';
      if (!bResult) 
        {
            unsigned long dwError;
            dwError = GetLastError();
                MessageBoxW(_T("Чтения файла"),_T("Ошибка"),MB_OK);
            return(-1);
        } 
     
    std::string s(rBuf);
        wchar_t* w_str = new wchar_t[s.length() + 1]();
        std::copy(s.begin(), s.end(), w_str);
    
    \\ собсно записываем полученый текст в переменную VALUE элемента  EditControl
        out_text.Insert(0,w_str);
        \\\ вместе с тем out_text.Insert(0, _T("это русский текст")); нормально отображается на экране

     UpdateData(false);

     CloseHandle(hFile);


 smile 

Автор: J0ker 3.10.2008, 06:37
Цитата(shara @  3.10.2008,  00:24 Найти цитируемый пост)
проблемы начинаются если читать текст из файла(созданного при помощи блокнота) и затем пытаться его вывести

блокнот по дефолту сохраняет текст как ANSI

Автор: xvr 3.10.2008, 12:18
Вот это 
Код

    std::string s(rBuf);
        wchar_t* w_str = new wchar_t[s.length() + 1]();
        std::copy(s.begin(), s.end(), w_str);
работать не будет. ANSI в UNICODE простым копированием не преобразуется (если только это не чисто английский текст)
См. функцию MultiByteToWideChar

Автор: shara 3.10.2008, 21:28
xvr,
подскажите пожалусто как эту функцию мне использовать в моей программе



пытался понять как она работает из МСДНа - неполучилось 

с типами данных проблемы
Код

BOOL UnicodeToANSI(LPWSTR Wstr,LPSTR Astr)
{
return WideCharToMultiByte(CP_ACP,0,Wstr,-1,Astr,128,NULL,NULL);
}

BOOL ANSI2Unicode(LPSTR Astr,LPWSTR Wstr)
{
return MultiByteToWideChar(CP_ACP,0,Astr,-1,Wstr,128);
}

Автор: xvr 4.10.2008, 08:19
Цитата(shara @ 3.10.2008,  21:28)
xvr,
подскажите пожалусто как эту функцию мне использовать в моей программе

пытался понять как она работает из МСДНа - неполучилось 
с типами данных проблемы

Типы данных вроде правильные

Код

BOOL UnicodeToANSI(wchar_t* Wstr, char* Astr)
{
return WideCharToMultiByte(CP_ACP,0,Wstr,-1,Astr,128,NULL,NULL)!=0;
}

BOOL ANSI2Unicode(char* Astr,wchar_t* Wstr)
{
return MultiByteToWideChar(CP_ACP,0,Astr,-1,Wstr,128)!=0;
}
Буфера для результирующих строк должны быть заказаны заранее и поданны в эти функции

Автор: shara 4.10.2008, 13:29
получилось  smile    
xvr, агромадное спасиба  smile 

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