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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.76
Delorthe
0 / 0 / 0
Регистрация: 29.05.2011
Сообщений: 85
#1

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

10.07.2011, 01:31. Просмотров 4645. Ответов 13

Пишу программу на С++ (недавно начал изучение). Весь код есть, компиляция проходит успешно, запускаю - вместо букв, "каракули". Естественно, нужно добавить (или как там это называется) русский язык. Пишу:
C++
1
setlocale(LC_ALL, "Russian");
Не помогает. Прошу помощи у интернета.
C++
1
2
3
#include <locale.h>
...
setlocale(LC_ALL, "rus"
Тоже самое. Что делать?
P.S DevC++ 4.9.9.2
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
10.07.2011, 01:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Использование русского языка в DevC++ (C++):

Ввод/вывод с использование русского языка - C++
Мне нужно ввести с клавиатуры строку на русском языке (например:&quot;Я живу в России&quot;) и вывести её также. Как это сделать? Я сколько не...

Подключение русского языка - C++
Недавно нашла,как сделать так,чтобы на экране отображались на русском языке не только фразы из cout&lt;&lt;, но и которые вводятся с...

Запрограммировать правило русского языка - C++
Правило написания букв И - Е в корнях с чередованием (-бер-, -бир(а)-, -дер-, -дир(а)- и т.д.). Например, собирать, соберет, сочетание.

Вывод русского языка в консоли - C++
Доброго времени суток, коллеги! Столкнулся с проблемой при написании простенькой программы шифрования/дешифрования текста: после...

Компилятор с поддержкой русского языка - C++
Использую MS Visual с++ 6.0, но он не поддерживает русского языка. Если в коде есть русские буквы - он заменяет их какими то непонятными...

Ошибка с подключением русского языка - C++
А так же, почему то выделяет красным число &quot;pi&quot; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;windows.h&gt; char bufRus; char*...

13
nameless
Эксперт С++
334 / 298 / 14
Регистрация: 16.06.2009
Сообщений: 486
10.07.2011, 10:33 #2
Delorthe,

Попробуйте таким образом еще:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <locale>
 
int main()
{
    std::locale::global(std::locale("rus"));
    std::cout << "Пишемсс по-русски..." << std::endl;
 
    return 0;
}
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.07.2011, 11:07 #3
nameless, у меня вылетает по неизвестной ошибке в Runtime.
Причем и wxDevC++, и в CodeBlocks
0
nameless
Эксперт С++
334 / 298 / 14
Регистрация: 16.06.2009
Сообщений: 486
10.07.2011, 11:26 #4
ValeryLaptev, интересно, в MVS2008 все хорошо, а вот в онлайн-компиляторе:
http://liveworkspace.org/code/9495fe9b29ae9b87ba0b51bcf3f13910 тоже падает;
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.07.2011, 11:41 #5
Цитата Сообщение от nameless Посмотреть сообщение
ValeryLaptev, интересно, в MVS2008 все хорошо, а вот в онлайн-компиляторе:
http://liveworkspace.org/code/9495fe9b29ae9b87ba0b51bcf3f13910 тоже падает;
В MVS2008 может быть хорошо по той же причине, почему и setlocale() работает.
Но там тоже локализация конкретно узкого потока не работает.
0
c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
10.07.2011, 12:26 #6
Библиотека windows.h.
Функции:
SetConsoleCP(1251);
SetConsoleOutputCP(1251);
После запуска консоли: пкм-> Свойства -> Шрифт -> Lucida Console
Пример:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <windows.h>
int main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    std::cout<<"Привет всем!!"<<std::endl;
    system("PAUSE");
    return 0;
}
0
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.07.2011, 12:48 #7
c++\noob, эт понятно, но хотелось стандартным способом, а не апишным.
0
Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
10.07.2011, 14:20 #8
Зачем человеку мозг пудрить?
Держи, брат, простую функцию, оригинально и понятно:
C++
1
2
3
4
5
6
7
char ch[100];                        //функция вывода русского языка в консоли
char *Rus(const char in[],char z[]); //
char *Rus(const char in[],char z[])  //
{                                    //
  if(CharToOem(in,z))return z;       //
  else return 0;                     //
}                                //
а писать в консоле будешь так, например:
C++
1
cout<<Rus("Получем следующие результаты: ",ch);
Добавлено через 1 минуту
только библиотеку #include<windows.h> введи

Добавлено через 6 минут
Вот к примеру:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
include<iostream.h>
#include<conio.h>
#include<windows.h>
 
char ch[100];                        //функция вывода русского языка в консоли
char *Rus(const char in[],char z[]); //
char *Rus(const char in[],char z[])  //
{                                    //
  if(CharToOem(in,z))return z;       //
  else return 0;                     //
}                                    //
 
int main()
{
 cout<<Rus("Я пишу по-русски!!! ",ch);
 getch();
}
0
Delorthe
0 / 0 / 0
Регистрация: 29.05.2011
Сообщений: 85
10.07.2011, 14:54  [ТС] #9
Cпасибо всем. Но каждый раз копировать функцию, на мой взгляд, не слишком удобно. Эх, если бы быо что-то запоминающееся, типа:
C++
1
setlocale( LC_ALL, "Russian")
В Visual Studio это работает, а в DevC++ и Code::Blocks - нет
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
10.07.2011, 15:01 #10
Цитата Сообщение от ValeryLaptev Посмотреть сообщение
но хотелось стандартным способом, а не апишным.
Как только найдёте стандарт, по которому кодовая страница, установленная в консоли, должна отличаться от кодовой страницы, используемой в системе, там же где-нибудь будет и "стандартный" способ писать в консоли по-русски...
В linux вот такой код
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <stdio.h>
#include <stdlib.h>
#include <wchar.h>
#include <locale.h>
 
int main(void){
    wchar_t name[BUFSIZ];
    const wchar_t welcome[] = L"Здравствуйте! Представьтесь, пожалуйста...";
    const wchar_t greeting[] = L"Рады приветствовать Вас, дорогой товарищ";
    const wchar_t errmsg[] = L"Ошибка ввода!";
    
    setlocale(LC_ALL, "");
    
    printf("%ls ", welcome);
    if ( scanf("%ls", name) != 1 ) {
        fprintf(stderr, "%ls\n", errmsg);
        exit(1);
    }
    
    printf("%ls %ls!\n", greeting, name);
    
    exit(0);
}
без проблем отработает, а вот в винде ещё поморочиться прийдётся, не смотря на то, что в DevC++ тот же gcc для компиляции используется (разумеется, портированный)...
Использование русского языка в DevC++
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
10.07.2011, 15:30 #11
Цитата Сообщение от easybudda Посмотреть сообщение
без проблем отработает, а вот в винде ещё поморочиться прийдётся, не смотря на то, что в DevC++ тот же gcc для компиляции используется (разумеется, портированный)...
В принципе, для "переносимости" можно было бы использовать нечто вроде этого:
C
1
2
3
4
5
#if defined(__GNUC__) && defined(WIN32)
    setlocale(LC_ALL, ".866");
#else
    setlocale(LC_ALL, "");
#endif
если бы не ещё одна беда. В исходных файлах C/C++ кодировка никак не указывается, и строка
C
1
L"русский текст";
Для VC должна быть набрана в cp-1251, а для GCC/MinGW в UTF-8.
Так что по-хорошему в исходниках вообще не должно быть символов с кодами больше 127, а все строки должны храниться в специальных ресурсных файлах.
Эх, был бы ещё способ встраивать строки для gettext в результирующий .exe (для линукса не надо, там и отдельных файлов достаточно).
2
ValeryLaptev
Эксперт С++
1041 / 820 / 48
Регистрация: 30.04.2011
Сообщений: 1,659
10.07.2011, 15:32 #12
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);            // установка контекста по умолчанию
0
easybudda
Модератор
Эксперт CЭксперт С++
9683 / 5633 / 956
Регистрация: 25.07.2009
Сообщений: 10,813
10.07.2011, 16:00 #13
Цитата Сообщение от grizlik78 Посмотреть сообщение
Так что по-хорошему в исходниках вообще не должно быть символов с кодами больше 127, а все строки должны храниться в специальных ресурсных файлах.
C этого места, если можно, чуть подробнее... Как из такого файла правильнее строки в программу внедрить?
0
grizlik78
Эксперт С++
1964 / 1457 / 119
Регистрация: 29.05.2011
Сообщений: 3,016
10.07.2011, 17:55 #14
Цитата Сообщение от easybudda Посмотреть сообщение
C этого места, если можно, чуть подробнее... Как из такого файла правильнее строки в программу внедрить?
На самом деле, если кто знает какие удобные, надёжные и кроссплатформенные средства для этого, то и сам с удовольствием послушаю.

Я же, в первую очередь подразумевал gettext. Но это, главным образом, инструмент интернационализации, так что для маленьких программ — как из пушки по воробьям может быть.

В программе записываются id-строки латиницей. Эти строки используются, если не удалось загрузить перевод для заданной локали (или в C-локали)
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// main.c
#include <stdio.h>
#include <locale.h>
// библиотека интернационализации
#include <libintl.h>
 
// макрос для краткой формы _() вместо gettext()
#define _(string) gettext (string)
 
int main()
{
    setlocale (LC_ALL, "");
    // перевод в домене test (файл test.mo),
    // дополнительно искать в текущей папке
    bindtextdomain ("test", ".");
    textdomain ("test");
    
    // через макрос
    char * str = _("this is main string!");
    // полная форма
    char * str2 = gettext("string2");
 
    printf("%s\n", str);
    printf("%s\n", str2);
    // или сразу в нужном месте
    printf("%s\n", _("test 3"));
 
    return 0;
}
создаём файл шаблона test.pot
Bash
1
$ xgettext --from-code=utf-8 -k_ main.c -o test.pot
создаём файл русского перевода ru.po (новые строки можно будет добавлять с помощью msgmerge)
Bash
1
$ msginit --locale=ru_RU.UTF-8
редактируем по вкусу
Код
# Russian translations for PACKAGE package
# Русские переводы для пакета PACKAGE.
# Copyright (C) 2011 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
#  <grizlik78@test.only>, 2011.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2011-07-10 17:31+0400\n"
"PO-Revision-Date: 2011-07-10 17:43+0400\n"
"Last-Translator:  <grizlik78@test.only>\n"
"Language-Team: Russian\n"
"Language: ru\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"

#: main.c:19
msgid "this is main string!"
msgstr "Это главная строка!"

#: main.c:21
msgid "string2"
msgstr "строка2"

#: main.c:26
msgid "test 3"
msgstr "тест 3"
осталось только создать бинарный файл перевода test.mo в нужном месте
Bash
1
$ msgfmt ru.po -o ru/LC_MESSAGES/test.mo
и можно запускать программу
Bash
1
2
3
4
5
6
7
8
9
$ ./a.out 
Это главная строка!
строка2
тест 3
 
$ LANG=C ./a.out 
this is main string!
string2
test 3

Не по теме:

Может теперь мне будет проще всё это вспоминать?

1
10.07.2011, 17:55
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2011, 17:55
Привет! Вот еще темы с ответами:

Неверное считывание символов русского языка - C++
Visual Studio 2013. При считывании русских символов всеми возможными средствами (cin, scanf, getch и др.) считывается неверный код, который...

Иероглифы с включенной в код функцией русского языка - C++
Добрый день, я столкнулся с проблемой, когда в отладке выдает иероглифы даже при ом условии, что в начале функции mailn объявлен русский...

В консоли вместо русского языка выводятся вопросительные знаки - C++
Столкнулся с такой проблемой. В консоли вместо русского языка выводятся вопросительные знаки (???? ?? ??). setlocale(LC_ALL,...

Поддержка русского языка в Embarcadero RAD Studio XE3 на Си++ - C++
Здравствуйте. Подскажите пожалуйста как включить полноценную поддержку русского языка в Embarcadero RAD Studio XE3? При вводе и выводе...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru