Форум русскоязычного сообщества Ubuntu


Следите за новостями русскоязычного сообщества Ubuntu в Twitter-ленте @ubuntu_ru_loco

Автор Тема: Как правильно отобразить русские буквы в консоли для любой локали С++ программы?  (Прочитано 3288 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн ABEgorov

  • Автор темы
  • Участник
  • *
  • Сообщений: 130
    • Просмотр профиля
Изучаю программирование. Вот решил посмотреть, как моя программа для Windows поведёт себя в Linux.
После исправления ошибок заметил следующее, возьмём к примеру hello world:
#include <iostream>
using std::cout;

int main()
{
    std::locale::global(std::locale(""));
    cout << "Здраствуй мир!\n";
    std::cin.get();
}
Если закоментировать первую строчку функции main, то на Windows эта программа выдаст каракули (так у консоли 866 кодировка, а у исходников обычно 1251). На Windows опять же в независимости от кодировки файла с исходниками, если первая строчка присутствует, то будут выведен текст именно на русском языке. На линукс судя повсему не так.
cout << "Здраствуй мир!\n"; я так понял выводит текст в той же кодировке, что и файл исходников.
Вопрос (из любопытства): можно ли добиться такого же поведения, что и на Windows. Т.е чтобы выводился текст в кодировке текущей локали. Собственно заметил, что при изменении переменной LANG другие программы меняют кодировку текста после перезапуска. Можно как-нибудь сделать такое и в этой программе? Можно ли это сделать средствами C++?

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
На плюсах не пишу, больше на чистом С, но беглое гугление показало, что методы те же. В начале программы вызвовите функцию setlocale() со следующими аргументами
setlocale(LC_CTYPE, "");

Оффлайн ABEgorov

  • Автор темы
  • Участник
  • *
  • Сообщений: 130
    • Просмотр профиля
Язык не имеет значения.
#include <stdio.h>
#include <locale.h>

int main()
{
  setlocale(LC_ALL, "");
  printf("Здраствуй мир!\n");
}
andrew@whkitten:~/Temp$ echo $LANG
ru_RU.UTF8
andrew@whkitten:~/Temp$ g++ main.c -o test
andrew@whkitten:~/Temp$ ./test
Здраствуй мир!
andrew@whkitten:~/Temp$ LANG=ru_RU.CP1251 konsole
andrew@whkitten:~$ ./Temp/test
Здраствуй мир!
Я хочу, чтобы во втором варианте текст выдавался на русском, как во всех линуксовых программах.

Оффлайн hippi90

  • Активист
  • *
  • Сообщений: 433
    • Просмотр профиля
Во всех линуксовых программах UTF-8, зачем вы туда Win-кодировку пихаете?

Оффлайн Mam(O)n

  • Заслуженный пользователь
  • Старожил
  • *
  • Сообщений: 5855
    • Просмотр профиля
как во всех линуксовых программах.
Рискну предположить, что в этих случаях используется gettext.

Оффлайн ABEgorov

  • Автор темы
  • Участник
  • *
  • Сообщений: 130
    • Просмотр профиля
Рискну предположить, что в этих случаях используется gettext.
Прочитал про gettext.  :) Понятно.
Т.е как в Windows, сделать вывод в консоль независимым от языка исходника не получится...
Сейчас вообще понял, что функции, связанные с локалью в Linux не очень работают (в частности tolower, toupper не работает для utf-8)...  :(

Пользователь решил продолжить мысль 08 Март 2011, 02:31:06:
Хотя нет, я ошибался.  :)
#include <iostream>
using std::wcout;

int main()
{
    std::locale::global(std::locale(""));
    wcout << L"Здраствуй, мир!" << std::endl;
}
Выводит текст на русском и при ru_RU.UTF8 и при ru_RU.CP1251. :-) Т.е надо просто всегда использовать wide версии классов и всё будет хорошо.
« Последнее редактирование: 08 Март 2011, 02:31:06 от ABEgorov »

 

Страница сгенерирована за 0.081 секунд. Запросов: 25.