Консольная печать строки и wstring в C++

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

У меня есть этот код...

std::string myName("vikrant");
std::cout<<myName<<std::endl;

std::wstring myNameHindi = L"मुरुगन";
std::wcout<<myNameHindi<<"-----"<<myNameHindi.size()<<std::endl;
std::wcout<<L"मुरुगन"<<std::endl;

std::string myNameHindiS = "मुरुगन";
std::cout<<myNameHindiS<<"-----"<<myNameHindiS.size()<<std::endl;

когда я компилирую и запускаю этот код на моем RHEL-боксе (... (подключен через ssh, работает gcc 4.1.2), я получаю это o/p (обратите внимание, две средние строки не печатаются должным образом)

vikrant
.A0A(-----6
.A0A(
मुरुगन-----18

На моем ноутбуке Apple и одном из ящиков FreeBSD (через ssh) я не получаю o/p от кода w_*. Я только что получил первый и последний кауты, казненные викрантом मुरुगन-----18

Насколько я понимаю, если не указано, эти строки будут обрабатываться как UTF 8. и если строка может обрабатывать это, wstring также будет обрабатывать. Что-то не так в этом подходе? Некоторые вопросы по аддону: это просто проблема с отображением? или wstring не надежен в linux? Любая дополнительная информация также может помочь.


person vikrant    schedule 18.03.2014    source источник
comment
Я рассмотрел этот вопрос ... это было действительно очень хорошо прочитано, но моя проблема более конкретна в том, что я получаю o / p. wstring не печатает строку на одних платформах и ничего не печатает на других. Мне нужна информация о том, как компилятор-редактор-ОС влияет на эту обработку.   -  person vikrant    schedule 18.03.2014
comment
@н.м. На самом деле я рассмотрел этот вопрос... он говорит (т.е. самый популярный ответ), что после установки ориентации потока вы не должны вызывать функцию, которая несовместима с ориентацией этого потока. Но когда я попробовал это... т.е. запустил мою программу с wcout (вместо cout)... она напечатала всего две строки со знаками вопроса.. т.е... ??????-----6 ?????? Он не печатал std::cout. Я понял, что смешивание этих двух вызывает эту проблему ... но не мог понять, почему я не получаю читаемый o/p (из wcout) ни в одном из случаев.   -  person vikrant    schedule 18.03.2014
comment
Если вы не получаете читаемый вывод от wcout без смешивания ориентации потока, задайте вопрос об этом это.   -  person n. 1.8e9-where's-my-share m.    schedule 18.03.2014


Ответы (1)


САМЫЙ ПРОСТОЙ СПОСОБ

Вот то, что вы ищете, #include <clocale> и, например, чтобы иметь турецкий язык, просто введите setlocale(LC_ALL,"Turkish"); в свой код.

Вы также можете просто оставить его как setlocale(LC_ALL,"");, он будет использовать ваш местный язык.

#include <iostream>
#include <clocale>

int main(){

setlocale(LC_ALL,"Turkish");

std::cout << "I can type any Turkish character like ÖöÇ窺İiĞğÜüİ, anything.\n" << std::endl;

system("pause");
return 0;
}

КАК-ТО ДРУГОЙ СТРАННЫЙ СПОСОБ ЭТОГО СДЕЛАТЬ

Это действительно странный способ сделать это, но он также будет работать.

#include <iostream>
int main()
{
std::string characters="IiĞğÇçÜüŞşÖö";
int i;
    for ( i=0; i<characters.length(); ++i ){
         characters[i]=(characters[i]==-2) ? 159:characters[i]; //ş
         characters[i]=(characters[i]==-3) ? 141:characters[i]; //ı
         characters[i]=(characters[i]==-4) ? 129:characters[i]; //ü
         characters[i]=(characters[i]==-10) ? 148:characters[i]; //ö
         characters[i]=(characters[i]==-16) ? 167:characters[i]; //ğ
         characters[i]=(characters[i]==-25) ? 135:characters[i]; //ç
         characters[i]=(characters[i]==-34) ? 158:characters[i]; //Ş
         characters[i]=(characters[i]==-35) ? 152:characters[i]; //İ
         characters[i]=(characters[i]==-36) ? 154:characters[i]; //Ü
         characters[i]=(characters[i]==-42) ? 153:characters[i]; //Ö
         characters[i]=(characters[i]==-48) ? 166:characters[i]; //Ğ
         characters[i]=(characters[i]==-57) ? 128:characters[i]; //Ç

         std::cout << characters[i] << " ";
    }
}
person Community    schedule 18.03.2014
comment
спасибо за ваши ответы ... но я ищу более конкретные ответы ... которые могут сказать мне, что мне нужно понять, чтобы получить доступ к печати этой строки на консоли. - person vikrant; 18.03.2014