Форум программистов, компьютерный форум CyberForum.ru

Использование русского языка в DevC++ - C++

Восстановить пароль Регистрация
Другие темы раздела
C++ Прошу помочь с прогой, если можно) надо её оживить... http://www.cyberforum.ru/cpp-beginners/thread331376.html
#include <conio.h> #include <stdio.h> #include <stdlib.h> #include <graphics.h> #include <time.h> #include <math.h> #include <iostream.h> #include <dos.h>
C++ Типы Данных Извиняюсь, за тупой вопрос, но какой самый большой целочисленный тип данных доступный в компиляторе visual c++ express edition 2010, по возможности с примером кода. http://www.cyberforum.ru/cpp-beginners/thread331363.html
Материал по ООП C++
Сейчас изучаю начало начал в с++. То есть простейшие консольные программы строю. Хотелось бы уже попробовать поработать с настоящим программо-строем. То есть посоздавать программы на WindowsForm с кнопочками, с полями.. Не знаю как точно объяснить. Чтобы программы были не консольные а с помощью различных диалоговых окон общались с пользователем. Не могли бы помочь мне и дать мне материала по этой...
C++ Структура,которая представляет односвязные списки
Помогите пожалуйста если не трудно.Во-первых ,почему то программа не хочет компилироваться.Во-вторых каким образом для данного класса объекты могут выделяться динамически. #include <stdio.h> struct Item { int x,y; Item *next; Item() {
C++ inline аксессоры/мутаторы http://www.cyberforum.ru/cpp-beginners/thread331349.html
собстно почему аксесоры/мутаторы некто не инлайнит ? поглядел пару опенсорсных проектов, везде вся реализация в .спп.
C++ Для чего необходимы списки. Существуют различные списка наподобие "Односвязный список", "Двусвязный список ". Объясните для чего они и где обычно используются. их достоинства и недостатки! подробнее

Показать сообщение отдельно
ValeryLaptev
Эксперт C++
1004 / 783 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
10.07.2011, 15:32     Использование русского языка в DevC++
Mr. Pyatachok, опять же - хотелось бы СТАНДАРТНЫМ способом, а не апишным, к тому же устаревшим.

Вот некоторый ликбез по широким строкам:

Для ввода/вывода русских символов и строк необходимо установить русскоязычный локальный констекст (локаль — locale). Локаль [1-22.1.1] — это объект, инкапсулирующий национальные особенности внешнего представления данных вроде символа-разделителя целой и дробной части в числах, формата даты и тому подобные «мелочи» [1-22.1.1.1.1]. Заодно локаль устанавливает и нужную кодировку. Вообще-то локали устроены довольно сложно — в стандарте [1] этой теме посвящен раздел 22, занимающий почти 50 страниц, но мы рассмотрим только простейшие применения для работы с потоками.

Для работы с локалями нужно прописать в программе оператор
C++
1
#include <locale>
После этого можно объявлять в программе объекты-локали., например
C++
1
locale american;        // установки по умолчанию
Установки по умолчанию, естественно, американские. Но ни объявление локалей, ни стандартные американские установки нас не интересуют. Локальный контекст устанавливается для потока.

Чтобы выводить русские символы на консоль, мы должны установить русскую локаль для wcout, а чтобы вводить русские символы нужно установить русскую локаль для wcin. Это делается с помощью метода потока imbue()[1-27.4.2.3], который имеет прототип
C++
1
locale imbue(const locale& L);
Параметром служит объект-локаль, но его не обязательно объявлять в программе — можно использовать временный анонимный объект, например
C++
1
wcout.imbue(locale("rus_rus.866"));
В данном случае русский контекст установлен для стандартного широкого потока wcout. Аргумент локали — строка «rus_rus.866». Эта строка называется именем локального контекста, и ее вид зависит от реализации . Это имя можно получить в виде строки типа string с помощью метода name() класса locale.
C++
1
2
locale loc ("rus_rus.866");
cout << loc.name( ) << endl;
На экран выведется
Russian_Russian.866

Это полное имя локали, мы же писали сокращенное. Первое слово Russian означает язык — русский, второе Russian — страна, 866 — кодовая страница.

После установки русской локали на экран в консольное окно нормально выводятся русские сообщения, например
C++
1
2
3
wstring s(L"Привет!");
wcout << L"Снова привет!" << endl;
wcout << s << endl;
Однако правильно выводятся только широкие русские строковые константы — в отличие от английских строковых констант, «узкие» русские строковые константы выводятся неправильно.

ПРИМЕЧАНИЕ
Можно установить русский контекст и для «узких» потоков. Однако в системе Windows консольные программы работают в специальном консольном окне, для которого система по умолчанию устанавливает 866 кодовую страницу как для ввода, так и для вывода. Когда же мы набираем текст программы в окне интегрированной среды, то установлена кодовая страница 1251, и русские константы записываются в программу в этой кодировке. Поэтому даже при установлении русской локали для потока cout русские текстовые константы выводятся неверно.
Для ввода русских букв нужно точно таким же способом задать русский контекст для входного широкого потока wcin
C++
1
wcin.imbue(locale("rus_rus.866"));
После этого можно будет вводить русские строки и символы обычными способами, которые мы рассматривали выше, например
C++
1
2
3
4
5
6
wstring s;
getline(wcin, s);       // ввод широкой строки с пробелами
wchar_t g[100]; 
wcin.getline(g,99);     // ввод символьного массива с пробелами
wcin.get(ch);           // ввод широкого символа
ch = wcin.get();        // ввод широкого символа
Все введенные символы нормально выводятся на экран.

Текущий локалный контекст можно сохранить как объект-локаль с помощью метода getloc(), который имеет прототип
C++
1
locale getloc() const;
Можно установить «классический» локальный контекст С с помощью метода
C++
1
static const locale& classic( );
Можно установить некоторую локаль по умолчанию методом
C++
1
static locale global(const locale& L);
Применять эти методы можно так:
C++
1
2
3
4
5
locale current = wcout.getloc();    // сохранение текущей локали
wcout.imbue(locale::classic());     // установка классической локали
wcout.imbue(locale(“C”));           // тоже установка классической локали
wcout.imbue(current);               // восстановление прежней локали
locale::global(current);            // установка контекста по умолчанию
 
Текущее время: 11:30. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru