Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Системное программирование и WinAPI > в 1000 раз о кириллице в КОНСОЛИ


Автор: slutsker 24.5.2007, 22:16
уважаемые и опытные программисты, я пытаюсь найти ответ на вопрос на многих форумах, но не могу найти, заранее прошу прощения (это наверно уже 100000 тема по поводу кириллицы, но мне кажется, что большую часть я из них уже прочел    :shok )

при вводе функции chartooem, которая  и упоминается во многих примерах вижу: пробовал много вариаций 

 error C2664: 'CharToOemW' : cannot convert parameter 1 from 'char *' to 'LPCWSTR'


(работаю в MS visual studio 2005)


НАДОЕЛО УЖЕ ПИСАТЬ  
         cout<<"vvedite 4islo";


вот один из привмеров, который я поьзовал

Код

#include "stdafx.h"
#include "windows.h"

int main(int argc, char* argv[])
{
    char s[]="Привет всем!";
    CharToOem(s,s);
    printf("%s\n", s);
    return 0;
}


Автор: zkv 24.5.2007, 22:33
slutsker, убери юникод (Unicode) в настройках проекта.

Автор: slutsker 24.5.2007, 22:50
zkv
не совсем понял, что именно надо сделать   smile 

Автор: Fazil6 24.5.2007, 22:51
Project->Properties->Configuration Properties->Character Set = Use Multi-Byte Character Set

Автор: Smarts 25.5.2007, 02:49
Странно, везде советуют убирать юникод...
Реально, с юникод в NT системах программы работают быстрее, так как ApiA функции только конвертируют аргументы в юникод и вызывают соответствующие ApiW функции.
Просто ставь букву L перед всеми строками, например так:
Код

#include "stdafx.h"
// #include "windows.h" <-- это включать в stdafx.h, но не в .срр файлах

int main(int argc, char* argv[])
{
    LPWSTR s[]= L"Привет всем!";
    wprintf("%s\n", s);
    return 0;
}

Автор: zkv 25.5.2007, 03:07
Smarts, если уж на то пошло, то лучше так:
Код

 LPCTSTR s[]= _T("Привет всем!");
 
тогда код не будет зависеть от настроек проекта. 

Цитата(Smarts @  25.5.2007,  02:49 Найти цитируемый пост)
Странно, везде советуют убирать юникод...


если человеку будет интересно узнать что такое юникод, то поиск выдаст ему вагон и маленькую тележку обсуждений, где этот самый юникод обсудили со всех сторон тыщу раз, а повторять одно и тоже напрягает, я предлагал создать и закрепить тему наподобие "Если у вас проблемы с VS2005", и там подробно описать тему с юникодом, потому что  slutsker явно не последний кто столкнулся с этой фичей студии, а начинающих тоже понять можно, они ведь не знают, что надо искать темы по ключевому слову "Unicode", пока им не скажут об этом.

Автор: Dronchik 25.5.2007, 09:34
Код

#include <iostream.h>//я среду старую 6 использую
#include <windows.h>

int main(int argc, char* argv[])
{
    char s[11];
    CharToOem("Привет всем",s);
    cout << s << "\n";
    return 0;
}


Автор: Fazil6 25.5.2007, 09:40
Цитата(Dronchik @  25.5.2007,  09:34 Найти цитируемый пост)
А на С++ писать слабо

ух ты!!! на С++.... !!!

Надо будет запомнить... На бумажку перепишу себе....

Объяснишь как это к вопросу относится ? 

Автор: Ln78 25.5.2007, 14:39
Dronchik, мы сами когда-то тоже были пятиклассниками и понимаем, что такое эмоциональное восприятие окружающей действительности с возрастом проходит. Но и ты пойми, что когда взрослые дяди о чем-то беседует, не всегда следует вмешиваться в их разговор (в 3 года можно почти всегда, в 13, увы, уже нет). 
По поводу 
Код

    char s[10];
    CharToOem("Привет всем",s);

посчитай, сколько у тебя буковок и достаточно ли ты отвёл для них места

Автор: JackYF 25.5.2007, 16:46
+1 двум предыдущим авторам.

Цитата(Dronchik @  25.5.2007,  09:34 Найти цитируемый пост)
А на С++ писать слабо


Мощность и красота С++ состоят вовсе не в том, что мы заменяем

printf/wprintf

на

cout <<


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

Автор: slutsker 25.5.2007, 16:51
Fazil6, спасибо, работает!

Автор: Smarts 25.5.2007, 23:38
Цитата(Dronchik @ 25.5.2007,  09:34)
А на С++ писать слабо

Код

#include <stdafx.h>
#include <windows.h>

int main(int argc, char* argv[])
{
    char s[10];
    CharToOem("Привет всем",s);
    cout << s << "\n"
    return 0;
}


О да, на С++, только твой код даже не скомпилится smile 

Автор: BigHeart 26.5.2007, 02:27
или используй функцию CharToOemW(...)   (c теми же параметрами)

Автор: Fazil6 26.5.2007, 08:13
Цитата(BigHeart @  26.5.2007,  02:27 Найти цитируемый пост)
или используй функцию CharToOemW(...)   (c теми же параметрами)

хм... Использовать вместо чего?

Автор: pograp 19.10.2007, 16:41
могу файл скинуть о Руссификации.

Автор: Dronchik 20.10.2007, 17:21
Fazil6, Глупости после школы морожу уже smile 
по теме
Код

setlocale(LC_ALL, "Russian"); 

И всё нормально потом русскими букавками выводит.

Автор: Con 17.11.2007, 11:17
1 Установи локаль 

//Правильный вывод кириллицы
wcout.imbue(locale(".866"));

2 И выводи русский текст 

wcout << L"Введите число галлонов: ";

Пример

#include <iostream>
using namespace std;

int main()
{
   //Правильный вывод кириллицы
   wcout.imbue(locale(".866"));
   wcout << L"Введите число галлонов: ";
   return 0;
}


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