Вывод русских букв
http://msdn.microsoft.com/en-us/library/ms647473(VS.85).aspx кури это ну и что-то похожее.
#include "conio.h"
#include "windows.h"
int _tmain(int argc, _TCHAR* argv[])
{
char *str="Привет!";
char *oemstr;
::CharToOem(str, oemstr);
printf("%s",oemstr);
getch();
return 0;
}
что я неправильно сделал?
В моём коде ошибка - обьявление второй переменной. Необходимо указать размер массива: char oemstr[100];
Вот ссылка на обсуждение этого вопроса:
http://forum.codenet.ru/showthread.php?t=36225
cout << "на вашем счету" << x << "рублей" << endl;
кроме того, не люблю я строки в стиле c.
Придумал функцию, которая хоть и ходит на грани дозволенного, но вроде работает :)
[COLOR="Red"]ВНИМАНИЕ: далее следует ошибочный код, который исправлен в последующих сообщениях.[/COLOR]
{
char message[str.size()];
CharToOem(str.c_str(),message);
return message;
}
cout << RussianMessage("на вашем счету") << x << RussianMessage("рублей") << endl;
хотя с юникодом наверно правильнее.
1. Вставляем следующий инклуд:
2. Единожды вызываем функцию:
3. Далее ввод-вывод делаем через потоки wcout\wcin:
int i;
wcin >> i;
wcout << i;
Вобщем wcout\wcin - полные аналоги потоков cout\cin только используют юникодные строки (Это те, что начинаются с "L", например L"Строка юникодная.")
И вообще для работы с юникодными строками есть много функций, они обычно начинаются с "w" или с "_w", это нужно смотреть, не помню.
Оно может и забавно, но сразу писать в OEM-кодировке в файле с ANSI-кодировкой трудновато, а операции с юникодом мой компилятор вроде бы не поддерживает:
http://www.mingw.org/MinGWiki/index.php/wide%20characters
Да и использую я консоль редко и в основном для изучения чего-либо и для опытов. Так, что конвертирование строк во время работы программы меня устраивает.
Придумал функцию, которая хоть и ходит на грани дозволенного, но вроде работает :)
{
char message[str.size()];
CharToOem(str.c_str(),message);
return message;
}
1>r:\программирование\test\main.cpp(8) : error C2057: expected constant expression
1>r:\программирование\test\main.cpp(8) : error C2466: cannot allocate an array of constant size 0
1>r:\программирование\test\main.cpp(8) : error C2133: 'message' : unknown size
Проблема решается, если объявить message динамически:
Для вывода русских строк вообще вполне достаточно способа, который описал Ordos. Чтобы не заморачиваться с юникодными строками, можно написать так:
...
setlocale(LC_ALL, "rus");
и далее можно пользоваться стандартным потоком вывода:
Впрочем, следующий код:
std::cin >> s;
std::cout << s;
все равно перекосячит русские буквы в нечто неудобоваримое...
1>r:\программирование\test\main.cpp(8) : error C2466: cannot allocate an array of constant size 0
1>r:\программирование\test\main.cpp(8) : error C2133: 'message' : unknown size
Проблема решается, если объявить message динамически:
хмм, а MinGW спокойненько переварил это безобразие, хотя я и подозревал, что может не пройти. Ну тогда так:
{
char *message = new char[str.size() + 1];
CharToOem(str.c_str(),message);
string buffer(message);
delete [] message;
return buffer;
}
string buffer может тут и не нужен, но я не разрешаю себе оставлять new без delete.
Да, по поводу setlocale(LC_ALL, "rus") и wcout: там не string надо использовать, а wstring.
#include <string>
#include <iostream>
#include <locale>
using namespace std;
int main()
{
setlocale(LC_ALL, ".866");
wstring str(L"Утро");
wcout << L"Доброе " << str << endl;
return 0;
}
MinGW на такой код ругается типа wcout не знает...
{
char *message = new char[str.size() + 1];
CharToOem(str.c_str(),message);
string buffer(message);
delete [] message;
return buffer;
}
string buffer может тут и не нужен, но я не разрешаю себе оставлять new без delete.
buffer тут очень даже нужен! и это единственно правильный пример с использованием CharToOem из всех приведенных, потому что он не портит память. Единственно чего не хватает это проверки на пустую строку. Гороздо быстрее проверить на empty чем вызывать кучу ничего не делающих системных вызовов (это будут как минимум 2 раза GetProcessHeap, 1 раз HeapAlloc, HeapFree, CharToOem)
за код подобный
{
char message[str.size()];
CharToOem(str.c_str(),message);
return message;
}
или
{
char message[100];
CharToOem(str.c_str(),message);
return message;
}
надо лишать права заниматься программированием на несколько лет.
Зачем? Не думаю, что здесь нужна эта перестраховка - по смыслу функция не предназначена для работы с пустыми строками. Если есть вероятность вывода пустой строки, лучше проверку сделать за пределами функции.
за код подобный
{
char message[str.size()];
CharToOem(str.c_str(),message);
return message;
}
...
надо лишать права заниматься программированием на несколько лет.
"Только тот не делает ошибок, кто ничего не делает".
Однако, предупреждение об ошибочности кода надо внести, чтоб людей не смущать... Тут я промахнулся.
лутше всего будит
main()
{
SetConsoleOutputCP(1251);
cout<<"Привет Миру..."<<endl;
}
Вот ведь неугомонные люди - каждый пытается показать, что самый умный, а остальные извращенцы ))))
Вот вам ссылка:
http://ovalsoft.nm.ru/Articles/Articles6.htm
там приведена куча методов, как выводить текст в консоль по русски. Про ваш метод там написано:
Так что, метод, конечно, очень удобный, но ни хрена толком не работающий. А жаль…
И действительно - у меня не работает этот метод.
http://ovalsoft.nm.ru/Articles/Articles6.htm
там приведена куча методов, как выводить текст в консоль по русски.[/QUOTE]Из всех методов самый путёвый - последний. Решение всяческих проблем с кодировками было придумано ещё хрен знает когда, и имя ему - Unicode. Уже и в дветыщипятой студии эта кодировка по умолчанию стоит, и в .NET (привожу как пример новых технологий) все строки юникодовые, и даже в мобильных телефонах уже давно используют шестнадцатибную кодировку (забавно в файл-менеджере наблюдать арабские каракули в именах арабских же файлов), а прогресс в массы всё не идёт: все как один продолжают использовать однобайты.
Не знаю кто как, но я как-то решил избавиться от пиратского софта. Денег у меня хватит только на Windows и антивирус, поэтому все остальное я заменил на свободно распостраняемое программное обеспечение (неразрешимой проблемой осталось пока только замена англо-русского словаря).
К чему это я? А к тому, что у MinGW этот Unicode - слабое место, не желает с ним работать (об этом я писал выше). Можно, конечно, перейти на бесплатную студию - вроде бы на ней все мои приложения компилируются (с небольшими поправками). Думаю об этом, но пока не собрал нужно количество за и против :)