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

Русский текст без танцев с бубнами - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 130, средняя оценка - 4.98
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.11.2011, 22:39     Русский текст без танцев с бубнами #1
Доброго времени суток.

Решил раз и навсегда понять, как выводить русские буквы на консоль без всяких танцев с system("chcp ...") или SetConsoleCP. Интересует вариант, при котором исходник неизменно хранится в UTF-8, и компилируется на разных платформах. В частности интересуют *nix, cygwin, mingw. Пробовал такой вариант:

Вариант с std::wstring
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
 
int main( )
{
    std::wcout << L'>';
 
    std::wstring input;
    getline( std::wcin, input );
 
    std::wcout << input;
 
    input = L",Здравствуй, мир!";
 
    std::wcout << L'\n' << input;
 
    return 0;
}
Цитата Сообщение от MinGW (gcc 4.6.1)
>Привет, мир!
Привет, мир!
,
Цитата Сообщение от Cygwin (gcc 4.5.3)
>здравствуй, мир!

,
(оба сожрали строки, начиная с первой русской буквы)


И такой:

Вариант с std::string
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <iostream>
#include <string>
 
int main( )
{
    std::cout << '>';
 
    std::string input;
    getline( std::cin, input );
 
    std::cout << input;
 
    input = ",Здравствуй, мир!";
 
    std::cout << '\n' << input;
 
    return 0;
}
Цитата Сообщение от MinGW (gcc 4.6.1)
>здравствуй, мир!
здравствуй, мир!
,╨Ч╨┤╤А╨░╨▓╤Б╤В╨▓╤Г╨╣, ╨╝╨╕╤А!
(что вполне ожидаемо)
Цитата Сообщение от Cygwin (gcc 4.5.3)
>здравствуй, мир!
здравствуй, мир!
,Здравствуй, мир!
(опа!)


И тут мне стало интересно, почему они сожрали std::wstring, начиная с первой встреченной русской буквы, и почему вдруг на cygwin заработал вариант с std::string, хотя std::wstring всё так же успешно сжирается? И самое главное: как сделать так, чтобы и std::wstring, и std::string корректно работали с русскими символами под всеми платформами без перекодирования исходника в нативную кодировку системы.

С локалями тоже не удалось:
std::locale

C++
1
2
3
4
// валится уже на конструкторе std::locale
std::locale( "rus_rus.1251" );
std::locale( "Russian_Russia.1251" );
// и подобные
оба (mingw и cygwin) выдают следующее:
terminate called after throwing an instance of 'std::runtime_error'
what(): locale::facet::_S_create_c_locale name not valid
Точно так же cygwin ругается на
C++
1
std::locale("");
MingW это кушает, но продолжает уверенный и наглый вывод в левой кодировке.
у mingw


В общем, я несколько в замешательстве. Стандартная библиотека C++ (и Си по возможности) предоставляет средства для решения подобных проблем?

Добавлено через 16 минут

Не по теме:

Возможно, стоило разместить эту тему в ветке "Кроссплатформенная разработка"?

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
16.11.2011, 17:48     Русский текст без танцев с бубнами
  #21

Не по теме:

talis, посмотрите сюда
Кодировка файла
(я чистил свои проекты и свои же исходники вытер балда, писать заново нету времени проще нарыть в своих архивах на форуме)
PS:Правда Вам обратное нужно будет сделать тобишь WideCharToMulyByte

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
16.11.2011, 18:28     Русский текст без танцев с бубнами #22
Решил написать маханький транслятор из файла с UTF-8 в 1251 вот что вышло
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
#include <windows.h>
#include <iostream>
#include <fstream>
#include <string>
using namespace std;
 
int main()
{
    system("chcp 1251");
    string lps;
    ifstream ifs("UTF-8.txt");
    if(!ifs)
       return 1;
    getline(ifs,lps);
    ifs.close();
   
    long uLen = MultiByteToWideChar(CP_UTF8,0,lps.c_str(),-1,NULL,NULL);
    WCHAR*lpw = new WCHAR[uLen];           
                MultiByteToWideChar(CP_UTF8,0,lps.c_str(),uLen,lpw,uLen);
 
        uLen  = WideCharToMultiByte(CP_ACP, 0, lpw,   -1,  NULL, NULL, NULL, NULL);
    char *str = new char[uLen];
                WideCharToMultiByte(CP_ACP, 0, lpw, uLen,  str , uLen, NULL, NULL);
   cout<<str<<endl;
   system("pause");
   return 0;
}
Мне думается не полностью отработало потому как решил сэкономить на коде и ifstream-ом читал втупую ifstream ifs("UTF-8.txt");
Миниатюры
Русский текст без танцев с бубнами   Русский текст без танцев с бубнами  
Вложения
Тип файла: txt UTF-8.txt (76 байт, 38 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2011, 18:54     Русский текст без танцев с бубнами
Еще ссылки по теме:

C++ Русский текст вывод
C++ Русский текст в консоли
Русский текст в консоли C++

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

Или воспользуйтесь поиском по форуму:
talis
 Аватар для talis
789 / 541 / 37
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
17.11.2011, 18:54  [ТС]     Русский текст без танцев с бубнами #23
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
MultiByteToWideChar
Цитата Сообщение от talis Посмотреть сообщение
компилируется на разных платформах. В частности интересуют *nix, cygwin, mingw
5букв
Yandex
Объявления
17.11.2011, 18:54     Русский текст без танцев с бубнами
Ответ Создать тему
Опции темы

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