cresta Что-то здесь не так. Если строки в сорцах в кодировке win1251, а ты выводишь их в консоль — естесственно, что кодировка не та будет, если в консоли не win1251. Надо либо набирать строки в консольной кодировке, либо преобразовывать их при выводе. Если уж ты хочешь исправить вывод, то определяй консольную кодировку через GetConsoleOutputCP.
В консоли я посмотрел - там GetConsoleOutputCP возвращает DOS codepage 866, что соответствует WIN codepage 1251. Данные у меня из базы берутся, там тоже utf8, но отбражаются почему-то неправильно. Я просто данные пропустил через CharToOem, и всё выводится в читабельном виде: Код (Text): int __cdecl printf(const char * format, ...){ char szBuff[2048]; char oemBuff[2048]; int retValue; DWORD cbWritten; va_list argptr; va_start( argptr, format ); retValue = wvsprintf( szBuff, format, argptr ); va_end( argptr ); oemBuff[0]=0; CharToOem ( szBuff, oemBuff ); WriteFile( GetStdHandle(STD_OUTPUT_HANDLE), oemBuff, retValue, &cbWritten, 0 ); return retValue; }
wsd Я наоборот хочу избавиться от разного рода либ или свести их количество и размеры к минимуму В принципе меня не тяготит вызвать одну функцию. Это проще, чем пристегивать ещё одну либу.
Cresta Эта либа тебе на всю жизнь пригодится! Она из любой кодировки в любую выжимает!!! Мож её статически или динамически пристёгиать!!! Там в принципе не код а чистые таблицы кодировок... А API вообще мизерный. Пробуй.
Я к тому, что если в консоли будет отличная от 866 кодировка, то твоя прога будет в пролёте. Чтобы это не случилось, используй перекодирование с учётом кодовой страницы: Код (Text): MultiByteToWideChar(CP_ACP, src, src_len, middle_buf...); WideCharToMultiByte(GetConsoleOutputCP(), middle_buf, -1, out_buf...); printf(out_buf);
IceStudent Вон ты о чём. Понял. n0name Пробовал устанавливать через SetConsoleOutputCP - ничего не меняется. Хотя и смысла никакого не было - кодировка то верная. Ввод правильно воспроизводится, вывод - кракозяблы. Хотя и для ввода и для вывода установлена одинаковая кодировка (сравнивал результат от GetConsoleCP и GetConsoleOutputCP). Только CharToOem нормально отображает. wsd Ок, попробую.