2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему
 
 Проблема с кириллицей в программе на C
Сообщение02.12.2010, 18:59 
Заслуженный участник
Аватара пользователя


28/07/09
1178
Доброго времени суток!
Делаю консольное приложение Win32 на C в MS Visual Studio 2010 Express Edition. Если попытаться вывести на экран кириллические символы, в приложении получим нечто непонятное из-за разницы кодировок. От этого спасает команда
Код:
setlocale(LC_ALL,"rus)
Но при считывании строки, содержащей кириллицу, мы опять получаем неизвестно что, даже если строку не менять, а просто вывести на экран сразу после считывания. Почему это происходит и как исправить положение? Спасибо.

 Профиль  
                  
 
 Re: Проблема с кириллицей в программе на C
Сообщение03.12.2010, 12:37 
Заслуженный участник


22/11/10
1183
Происходит потому, что "импортные редиски" толком не доделали работу с локалью. Им кириллица не нужна. Сам с этой бедой намучался. Но вроде как проблему удалось победить следующим образом:

char inbuff[128];
char *loc=setlocale(LC_ALL,"rus");
int origCP=GetConsoleCP();

SetConsoleCP(1251);
gets(inbuff);
// mess
printf("%s\n",inbuff);

SetConsoleCP(origCP);
printf("%s\nВсе хорошо !!!\n",inbuff);

SetConsoleCP(1251);
gets(inbuff);
// mess
printf("%s\n",inbuff);

SetConsoleCP(origCP);
printf("%s\nОпять все хорошо !!!\n",inbuff);

Метод проб и ошибок показал, что при считывании надо постоянно выставлять 1251,
а при выводе - origCP=866. Очень, очень креативно.
Там еще есть пара функций Get/Set ConsoleOutputCP. Но их воздействие на результат я не понял. Может в этом и есть какая нибудь логика, но я ее не смог установить. Кстати, а "setlocale()" почему-то все равно надо вызывать. Похоже на четное количество ошибок.

-- Пт дек 03, 2010 15:39:39 --

Происходит потому, что "импортные редиски" толком не доделали работу с локалью. Им кириллица не нужна. Сам с этой бедой намучался. Но вроде как проблему удалось победить следующим образом:

char inbuff[128];
char *loc=setlocale(LC_ALL,"rus");
int origCP=GetConsoleCP();

SetConsoleCP(1251);
gets(inbuff);
// mess
printf("%s\n",inbuff);

SetConsoleCP(origCP);
printf("%s\nВсе хорошо !!!\n",inbuff);

SetConsoleCP(1251);
gets(inbuff);
// mess
printf("%s\n",inbuff);

SetConsoleCP(origCP);
printf("%s\nОпять все хорошо !!!\n",inbuff);

Метод проб и ошибок показал, что при считывании надо постоянно выставлять 1251,
а при выводе - origCP=866. Очень, очень креативно.
Там еще есть пара функций Get/Set ConsoleOutputCP. Но их воздействие на результат я не понял. Может в этом и есть какая нибудь логика, но я ее не смог установить. Кстати, а "setlocale()" почему-то все равно надо вызывать. Похоже на четное количество ошибок.

-- Пт дек 03, 2010 15:41:10 --

Происходит потому, что "импортные редиски" толком не доделали работу с локалью. Им кириллица не нужна. Сам с этой бедой намучался. Но вроде как проблему удалось победить следующим образом:

char inbuff[128];
char *loc=setlocale(LC_ALL,"rus");
int origCP=GetConsoleCP();

SetConsoleCP(1251);
gets(inbuff);
// mess
printf("%s\n",inbuff);

SetConsoleCP(origCP);
printf("%s\nВсе хорошо !!!\n",inbuff);

SetConsoleCP(1251);
gets(inbuff);
// mess
printf("%s\n",inbuff);

SetConsoleCP(origCP);
printf("%s\nОпять все хорошо !!!\n",inbuff);

Метод проб и ошибок показал, что при считывании надо постоянно выставлять 1251,
а при выводе - origCP=866. Очень, очень креативно.
Там еще есть пара функций Get/Set ConsoleOutputCP. Но их воздействие на результат я не понял. Может в этом и есть какая нибудь логика, но я ее не смог установить. Кстати, а "setlocale()" почему-то все равно надо вызывать. Похоже на четное количество ошибок.

 Профиль  
                  
 
 Re: Проблема с кириллицей в программе на C
Сообщение07.12.2010, 01:44 
Заслуженный участник
Аватара пользователя


28/07/09
1178
Спасибо,sup, разобрался!

 Профиль  
                  
 
 Re: Проблема с кириллицей в программе на C
Сообщение15.12.2010, 23:42 
Аватара пользователя


30/05/09
121
Киев
Дело было в MS VS 2008. Думаю, что за 2 года ничего не должно поменяться.

#include <windows.h>
#include <iostream>
usinng namespace std;
...
char Buff[300], N[300];

CharToOemA("Введите строку: ", Buff);
cout<<Buff<<endl;
cin.getline(N, 300);
cout<<"N= "<<N<<endl;
...

CharToOem - API функция, объявлена в windows.h OEM (Original Equipment Manufactured).
Как и всякая API функция, работающая со строками имеет A (ANSI) W (Wide) версии. Так что можно или со старту писать ANSI версию или, в параметрах проекта изменить свойство Charset из Unicode в NotSet.
Более подробно си. MSDN.

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 4 ] 

Модераторы: Karan, Toucan, PAV, maxal, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group