0 / 0 / 0
Регистрация: 29.05.2011
Сообщений: 85
1

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

10.07.2011, 01:31. Показов 29919. Ответов 13

Author24 — интернет-сервис помощи студентам
Пишу программу на С++ (недавно начал изучение). Весь код есть, компиляция проходит успешно, запускаю - вместо букв, "каракули". Естественно, нужно добавить (или как там это называется) русский язык. Пишу:
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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2011, 01:31
Ответы с готовыми решениями:

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

Использование русского языка в программе
Подскажите пожалуйста как в паскале сделать русский язык?

Использование русского языка в дате POST запроса
Собственно какую кодировку использовать? При успользованию UTF8 какие-то символы типа P&gt;P и т.д....

Графическая консоль в devc++ постоянно грузит и не откликается на действия в devc++ пишу на си с использованием graphics
#include&lt;conio.h&gt; #include&lt;graphics.h&gt; void draw(int x, int y, int color) { setfillstyle(1,...

13
Эксперт С++
342 / 306 / 36
Регистрация: 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
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
10.07.2011, 11:07 3
nameless, у меня вылетает по неизвестной ошибке в Runtime.
Причем и wxDevC++, и в CodeBlocks
0
Эксперт С++
342 / 306 / 36
Регистрация: 16.06.2009
Сообщений: 486
10.07.2011, 11:26 4
ValeryLaptev, интересно, в MVS2008 все хорошо, а вот в онлайн-компиляторе:
http://liveworkspace.org/code/... bcf3f13910 тоже падает;
0
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
10.07.2011, 11:41 5
Цитата Сообщение от nameless Посмотреть сообщение
ValeryLaptev, интересно, в MVS2008 все хорошо, а вот в онлайн-компиляторе:
http://liveworkspace.org/code/... bcf3f13910 тоже падает;
В MVS2008 может быть хорошо по той же причине, почему и setlocale() работает.
Но там тоже локализация конкретно узкого потока не работает.
0
-2 / 2 / 1
Регистрация: 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
Эксперт С++
1069 / 848 / 60
Регистрация: 30.04.2011
Сообщений: 1,659
10.07.2011, 12:48 7
c++\noob, эт понятно, но хотелось стандартным способом, а не апишным.
0
8 / 9 / 1
Регистрация: 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
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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,751
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
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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
Эксперт С++
1069 / 848 / 60
Регистрация: 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
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12454 / 7479 / 1752
Регистрация: 25.07.2009
Сообщений: 13,751
10.07.2011, 16:00 13
Цитата Сообщение от grizlik78 Посмотреть сообщение
Так что по-хорошему в исходниках вообще не должно быть символов с кодами больше 127, а все строки должны храниться в специальных ресурсных файлах.
C этого места, если можно, чуть подробнее... Как из такого файла правильнее строки в программу внедрить?
0
Эксперт С++
2381 / 1665 / 279
Регистрация: 29.05.2011
Сообщений: 3,399
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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
10.07.2011, 17:55
Помогаю со студенческими работами здесь

Ввод русского языка
Не могу понять, как сделать так, чтобы вместо непонятных иероглифов в командной строке выдавался...

Словарь русского языка
Подскажите пожалуйста где можно скачать словарь русского языка в txt желательно в кодировkе utf8 и...

не видно русского языка
Здравствуйте!Скачал шаблон сайта,но он не поддерживает русского языка(его не видно на...

Вывод русского языка
Ввожу #include &lt;locale.h&gt; setlocale(LC_ALL,&quot;.1251&quot;); или setlocale(LC_ALL,&quot;rus&quot;); На...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru