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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 33, средняя оценка - 4.76
Delorthe
0 / 0 / 0
Регистрация: 29.05.2011
Сообщений: 85
10.07.2011, 01:31     Использование русского языка в DevC++ #1
Пишу программу на С++ (недавно начал изучение). Весь код есть, компиляция проходит успешно, запускаю - вместо букв, "каракули". Естественно, нужно добавить (или как там это называется) русский язык. Пишу:
C++
1
setlocale(LC_ALL, "Russian");
Не помогает. Прошу помощи у интернета.
C++
1
2
3
#include <locale.h>
...
setlocale(LC_ALL, "rus"
Тоже самое. Что делать?
P.S DevC++ 4.9.9.2
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
10.07.2011, 10:33     Использование русского языка в DevC++ #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;
}
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
10.07.2011, 11:07     Использование русского языка в DevC++ #3
nameless, у меня вылетает по неизвестной ошибке в Runtime.
Причем и wxDevC++, и в CodeBlocks
nameless
Эксперт C++
 Аватар для nameless
289 / 288 / 14
Регистрация: 16.06.2009
Сообщений: 486
10.07.2011, 11:26     Использование русского языка в DevC++ #4
ValeryLaptev, интересно, в MVS2008 все хорошо, а вот в онлайн-компиляторе:
http://liveworkspace.org/code/9495fe...0b51bcf3f13910 тоже падает;
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
10.07.2011, 11:41     Использование русского языка в DevC++ #5
Цитата Сообщение от nameless Посмотреть сообщение
ValeryLaptev, интересно, в MVS2008 все хорошо, а вот в онлайн-компиляторе:
http://liveworkspace.org/code/9495fe...0b51bcf3f13910 тоже падает;
В MVS2008 может быть хорошо по той же причине, почему и setlocale() работает.
Но там тоже локализация конкретно узкого потока не работает.
c++\noob
 Аватар для c++\noob
-2 / 2 / 0
Регистрация: 13.11.2010
Сообщений: 52
10.07.2011, 12:26     Использование русского языка в DevC++ #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;
}
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
10.07.2011, 12:48     Использование русского языка в DevC++ #7
c++\noob, эт понятно, но хотелось стандартным способом, а не апишным.
Mr. Pyatachok
 Аватар для Mr. Pyatachok
8 / 8 / 0
Регистрация: 30.06.2011
Сообщений: 250
10.07.2011, 14:20     Использование русского языка в DevC++ #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();
}
Delorthe
0 / 0 / 0
Регистрация: 29.05.2011
Сообщений: 85
10.07.2011, 14:54  [ТС]     Использование русского языка в DevC++ #9
Cпасибо всем. Но каждый раз копировать функцию, на мой взгляд, не слишком удобно. Эх, если бы быо что-то запоминающееся, типа:
C++
1
setlocale( LC_ALL, "Russian")
В Visual Studio это работает, а в DevC++ и Code::Blocks - нет
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.07.2011, 15:01     Использование русского языка в DevC++ #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++
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
10.07.2011, 15:30     Использование русского языка в DevC++ #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 (для линукса не надо, там и отдельных файлов достаточно).
ValeryLaptev
Эксперт C++
1005 / 784 / 46
Регистрация: 30.04.2011
Сообщений: 1,595
10.07.2011, 15:32     Использование русского языка в DevC++ #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);            // установка контекста по умолчанию
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
10.07.2011, 16:00     Использование русского языка в DevC++ #13
Цитата Сообщение от grizlik78 Посмотреть сообщение
Так что по-хорошему в исходниках вообще не должно быть символов с кодами больше 127, а все строки должны храниться в специальных ресурсных файлах.
C этого места, если можно, чуть подробнее... Как из такого файла правильнее строки в программу внедрить?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
10.07.2011, 17:55     Использование русского языка в DevC++
Еще ссылки по теме:

C++ Подключение русского языка
В консоли вместо русского языка выводятся вопросительные знаки C++
Неверное считывание символов русского языка C++

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

Или воспользуйтесь поиском по форуму:
grizlik78
Эксперт С++
 Аватар для grizlik78
1884 / 1416 / 102
Регистрация: 29.05.2011
Сообщений: 2,961
10.07.2011, 17:55     Использование русского языка в DevC++ #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

Не по теме:

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

Yandex
Объявления
10.07.2011, 17:55     Использование русского языка в DevC++
Ответ Создать тему

Метки
gettext
Опции темы

Текущее время: 08:28. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru