На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! Правила раздела FAQ в группе разделов С++.
1. Раздел FAQ предназначен для публикации готовых статей.
2. Здесь нельзя задавать вопросы, для этого существуют соответствующие разделы:
Чистый С++
Visual C++ / MFC / WTL / WinApi
Borland C++ Builder
COM / DCOM / ActiveX / ATL
Сопутствующие вопросы
3. Внимание, все темы и сообщения в разделе премодерируются. Любое сообщение или тема будут видны остальным участникам только после одобрения модератора.
Модераторы: B.V., Qraizer
  
> В консоли (под Windows) не отображаются русские символы , Что делать?
    Чаще всего причина в том, что кодировка консоли и кодировка выводимой строки не совпадают (CP 866, также известная как DOS, для консоли и Windows-1251 для файла). Самое простое решение - записать файл в кодировке CP 866. В среде Visual Studio это делается с помощью опции меню "File -> Advanced Save Options...".
      вариант программно с использованием средств языка
      ExpandedWrap disabled
        #include <string>
        #include <iostream>
         
        std::string rus(std::string strIn)
        {
            std::string strOut=strIn;
            for(std::string::size_type i=0;i<strOut.length();++i)
            {
                if(strOut[i]>='А'&& strOut[i]<='п' )
                    strOut[i]-=64;
                if(strOut[i]>='р'&& strOut[i]<='я' )
                    strOut[i]-=16;
            }
            return strOut;
        }
         
        int main()
        {
            std::cout<<rus("Текст")<<std::endl;
        }

      ещё вариант с использованием WinApi
      ExpandedWrap disabled
        LPCSTR Rus(LPCTSTR pszIn)
        {
            static char szBuffer[MAX_PATH];
            CharToOemBuff(pszIn, szBuffer, MAX_PATH);
            return szBuffer;
        }
        ExpandedWrap disabled
          #include <iostream>
          #include <locale>
          #include <cstdio>
           
          int main()
          {
              setlocale(LC_ALL, "russian_russia.1251");
           
              std::cout << "Тест" << std::endl;
           
              std::wcout << L"Тест юникода" << std::endl;
           
              printf("Тест C\n");
           
              return 0;
          }
          n0rd, а разве работает в ОСях ниже ХП?
            Цитата barazuk @
            n0rd, а разве работает в ОСях ниже ХП?

            почему не должно работать? Может разве что в 98-й работать не будет, т.к. там поддержки Юникода еще не было
              Можно кодировку консоли изменить:

              ExpandedWrap disabled
                #include <iostream>
                #include <windows.h>
                 
                int main()
                {
                    SetConsoleOutputCP(1251);
                 
                //That's all
                 
                    return 0;
                }
                Тут видимо имелось в виду то, что поддержка локалей в C++ опирается на ОС API, а в ОСах до XPёвых времён возможна недостача кодовых страниц. Естественно, что C++ тут будет бессилен.

                P.S. Впрочем, и сугубо Cшная setlocale() в некоторых реализациях может быть подвержена определённым ограничениям RTL. Например, при использовании STLPort совместно с VC она ведёт себя не так, как оригинальная MSная setlocale().
                Сообщение отредактировано: Qraizer -
                  Цитата barazuk @
                  n0rd, а разве работает в ОСях ниже ХП?

                  А надо? :) Windows 98 с поддержки микроосфтом снята, кто ей пользуется, тот сам себе злобный буратино.


                  Цитата miksayer @
                  Может разве что в 98-й работать не будет, т.к. там поддержки Юникода еще не было

                  В 95 (не OSR 2), с этим было туго, в 98 должно быть нормально, хотя я не проверял.
                    А у меня не получаеться уговорить мою хрюшу на utf-16

                    Вот прямо в консольке вбиваю и получаю

                    Цитата

                    C:\>chcp 1200
                    Указана недопустимая кодовая страница

                    C:\>chcp 65001
                    Текущая кодовая страница: 65001



                    Как видите, utf-8 скушал. А на utf-16 материться.

                    коды смотрел здесь
                      Варианты
                      Цитата n0rd @
                      ExpandedWrap disabled
                        #include <iostream>
                        #include <locale>
                        #include <cstdio>
                         
                        int main()
                        {
                            setlocale(LC_ALL, "russian_russia.1251");
                            std::cout << "Тест" << std::endl;
                            std::wcout << L"Тест юникода" << std::endl;
                            printf("Тест C\n");
                            return 0;
                        }

                      и
                      Цитата Dimka_PREsideNT @
                      ExpandedWrap disabled
                        SetConsoleOutputCP(1251);
                      В C++Builder 6 не работают.
                        Кстати, ни один из вышеприведенных вариантов с установками локали у меня в Code::Blocks Так и не заработал. Зато функция rus, изменяющая код символа с win1251 на внутренню code::blocks работает прекрасно.
                          Функция rus (в подавляющем большинстве своих вариантов) как правило перестает работать, как только сталкивается с нетривиальными случаями.

                          Внутренняя Code::Blocks как правило совпадает с системной, то есть windows-1251.

                          Что заметил, в куче кодировок, которые знает Code::Blocks, нет ни одной OEM (8xx).
                          0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
                          0 пользователей:


                          Рейтинг@Mail.ru
                          [ Script execution time: 0,0432 ]   [ 16 queries used ]   [ Generated: 28.03.24, 08:51 GMT ]