2014 dxdy logo

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

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




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

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

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 
Аватара пользователя
Спасибо,sup, разобрался!

 
 
 
 Re: Проблема с кириллицей в программе на C
Сообщение15.12.2010, 23:42 
Аватара пользователя
Дело было в 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 ] 


Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group