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


Автор: lamber 29.3.2011, 10:37
Собственно классическая проблема. погугли нашел массу рецептов, но мне так и не помогло, обращаюсь к знающим нид хелп.
Простая програмулька считываем тевстовый файл выводим в консоль. Ниже код и прилеплю файл который пытаюсь считать

Код

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

    DWORD nIn;
    char buffer[256];
    char rus_buff[256];
    HANDLE hFile;
    ZeroMemory(rus_buff,256);
    hFile=CreateFileA("temp.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
    while(ReadFile(hFile,buffer,255,&nIn,NULL) && nIn >0)
    {
        OemToCharBuffA(buffer,rus_buff,nIn);
        cout<<buffer;
    }
    getchar();
 return 0;
}


Автор: Estranged 29.3.2011, 11:14
Не смешивайте win косоль и косольный вывод в С.
WriteConsole или setlocale. Выберите одно. smile

Автор: lamber 29.3.2011, 11:17
2Estranged

Предпологал что возможно в этом будет косяк, можно работающий пример на WinAPI, если не сложно :?

Автор: Estranged 29.3.2011, 13:49
Код

#define UNICODE
#include <windows.h>

void main (int argc, char * argv[])
{
    HANDLE hConsole; DWORD written;
    hConsole = GetStdHandle (STD_OUTPUT_HANDLE);
    
    WriteConsole (hConsole, L"Привет!", sizeof L"Привет!" >> 1, &written, NULL);
    return ;
}


Автор: lamber 29.3.2011, 14:33
2Estranged
так то и я могу бро))) а вот с фалом что прикрепил не получается)))

Автор: GremlinProg 29.3.2011, 14:50
OemToChar используется только при работе с Oem-кодировкой,
а тут - юникод, вот и надо считывать из файла юникод,
например, с помощью 
Код
fopen_s( ..., "r, ccs=UTF-8");

а далее - явно с wcs-функциями, такими как fgetwc и putwc

Автор: lamber 29.3.2011, 15:42
А можно ли тоже самое но с имспользованием WinAPI все таки отпик именно в этой теме, без использования ANSI C. 

Автор: xvr 29.3.2011, 18:07
Ваш файл в Unicode (в UTF-8). OemToCharBuffA это не берет. Вам нужна комбинация из MultiByteToWideChar и WideCharToMultiByte


Автор: Estranged 30.3.2011, 14:14
Код

    DWORD nIn;
    char buffer[256];
    HANDLE hFile2;
    wchar_t* pRes = 0;
    int res_len = 0;
    hFile2=CreateFileA("temp.txt",GENERIC_READ,0,NULL,OPEN_EXISTING,0,NULL);
    HANDLE hConsole; DWORD written;
    hConsole = GetStdHandle (STD_OUTPUT_HANDLE);  
    
    while(ReadFile(hFile2,buffer,255,&nIn,NULL) && nIn >0)
    {
        buffer [nIn] = '\0';
        res_len = MultiByteToWideChar(CP_UTF8, 0, buffer, -1, 0, 0);
        pRes = new wchar_t[res_len];
        MultiByteToWideChar(CP_UTF8, 0, buffer, -1, pRes, res_len);
        DWORD dw = GetLastError ();
        WriteConsole (hConsole, pRes + 1, res_len - 1, &written, NULL);
        delete [] pRes;
    }
    CloseHandle (hFile2);
    getchar();
    return ;


Про
#define UNICODE
#include <windows.h>
не забудьте только

Автор: lamber 1.4.2011, 09:41
2Estranged

Спасибо дружище все работает.

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