Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Помогите разобраться с кодировками в консольном приложении  (Прочитано 5633 раз)
0 Пользователей и 1 Гость смотрят эту тему.
tumanovalex
Помогающий

ru
Offline Offline

« : 01-10-2008 10:08 » 

Консольное приложение, Visual C. В консольном приложении хотелось бы на экран вывести данные так, чтобы были буквы, а не закорючки. Кроме того, хотелось бы научиться для этой же цели использовать SetConsoleOutputCP. Попробовал несколько вариантов, но что-то не получается. Лучше всего работает Decode_Win_to_DOS (нашел в интернете), но буквы Ёё воспроизводит неправильно. Ниже - моя программа:
Код:
long getfilesize(FILE *hfile) {
long filesize = 0;
if(!fseek(hfile, 0, SEEK_END)) {
filesize = ftell(hfile);
fseek(hfile, 0, SEEK_SET);
}
else {
printf("Can't read file INI\n");
_getch();
exit(1);
}
return(filesize);
}

int get_bittable(unsigned char Data, int nbit, unsigned short Mask, char *strbit) {
int Res = 0, i = 0;
for (i = 0; i < nbit; i++) {
if(Mask & Data) {
Res++;
strcat(strbit,"1");
}
else {
strcat(strbit,"0");
}
Mask >>= 1;
}
return Res;
}

char* Decode_Win_to_DOS(char * str)
{
unsigned char *cstr=str;
for(;*cstr;cstr++)
{
if(*cstr>=240)
*cstr-=16;
else if(*cstr>=192)
*cstr-=64;
else if(*cstr==185)
*cstr=252;
}
return str;
}

void main(int argc, char* argv[]) {
FILE *pfile; // указатель для C
long filesize, i, k;
unsigned char c[2], c1[2], s[9], *p;
char zag[] = "Символ\t\tДвоичное представление\t\tКол-во единиц\n";
printf("%i\n", GetConsoleOutputCP());
if(SetConsoleOutputCP(1251)!=0)
printf("%s", zag);
// CharToOem(zag, zag);
if((pfile = fopen("Знаки.txt", "rb"))==NULL) {
printf("Can't open input file\n");
_getch();
exit(1);
} // if((pfile
filesize = getfilesize(pfile);
p = malloc(filesize);
p[0]='\0';
fread(p, sizeof( char ), filesize , pfile);
for(k = 0; k < filesize; k++) {
s[0] = '\0';
c[0] = '\0';
// c1[0] = '\0';
c1[1] = '\0';
strncat(c, p, 1);
// strncat(c1, c, 1);
// CharToOem(c, c);
if(c[0]>='А'&& c[0]<='п' )
c1[0] = c[0]-64;
if(c[0]>='р'&& c[0]<='я' )
c1[0] = c[0]-16;
i = get_bittable(c[0], 8, 0x80, s);
// printf("%s\t\t\t%s\t\t\t%i\n", Decode_Win_to_DOS(c1), s, i);
printf("%c\t\t\t%s\t\t\t%i\n", c[0], s, i);
p++;
}
fclose(pfile);
_getch();
} //main
Файл Знаки.txt состоит из одной строки в кодировке ANSI:
АаБбВвГгДдЕеЁёЖжЗзИиЙйКкЛлМмНнОоПпРрСсТтУуФфХхЦцЧчШшЩщЪъЫыЬьЭэЮюЯя 1234567890!"№/;%:?*(-).
  • ,!_
« Последнее редактирование: 01-10-2008 10:15 от Finch » Записан
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 01-10-2008 16:53 » 

tumanovalex, под кодировкой "ANSI" (ибо нет такой кодировки), как я понимаю, здесь подразумевается cp1251.

Если бы ты не поленился работать поиском, то узнал бы, что в винде кодировка работы с консолью (в нашем случае) - cp866. Также узнал бы, какими функциями сделать перекодировку. Приводить их не буду - сто раз спрашивали - ищи.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines