Попытка напечатать шахматные фигуры в Visual Studio 2013

0

Я пытаюсь напечатать "пешку" при использовании визуальной студии, и она не распознает юникод.

может ли кто-нибудь сказать мне, как это исправить?

это основной пример:

#include <iostream>

using namespace std;

int main()
{
 cout << "\33[37;42m\u2659\33[0m";
}

и выход я получаю:

"<-[37;42m?<-[0m".

  • 0
    Пожалуйста, не используйте void main в примерах, поскольку это неверный код, и учащиеся, читающие SO, могут скопировать его некритически.
Теги:
visual-studio-2012

1 ответ

3
Лучший ответ

Обычные оконные окна Windows не поддерживают escape-последовательности ANSI.

Чтобы отобразить общие символы Юникода, вы можете

  • используйте вместо этого функции консоли Windows или

  • настроить стандартные потоки данных на Unicode (расширение Microsoft, см. _setmode) и использовать широкие потоки или

  • например, отобразить текстовый файл с нужным текстом, например, закодированный в UCS-2.


Пример 1: Использование функций консоли Windows.

Код:

#undef UNICODE
#define UNICODE
#include <windows.h>

#include <string>

namespace console {
    using std::wstring;

    const HANDLE output = GetStdHandle( STD_OUTPUT_HANDLE );

    void write( const wstring& text )
    {
        if( text.length() == 0 ) { return; }
        DWORD n_chars_written = 0;
        WriteConsole( output, &text[0], text.length(), &n_chars_written, 0 );
    }
}

auto main() -> int
{
    console::write( L"Oh look, a \u2659!\n" );
}

Запуск этого в обычной консоли Windows, скорее всего, приведет к созданию квадрата вместо символа пешки даже в Windows 8.x, например, с помощью шрифта Lucida Console. Это потому, что реализация консольного окна просто не поддерживает представление таких символов. Символ правильно сохранен, и вы можете его скопировать и, например, представить его в Windows Write (стандартная аксессуарная программа), но это непрактично, скажем так, для обычного конечного пользователя.

Простое решение - потребовать использования, например, замены окна консоли консоли.

Затем вы получаете отличные вкладки. ;-)

H:\dev\test\so\0208>g++ using_console_api.cpp

H:\dev\test\so\0208>a
Oh look, a ♙!

H:\dev\test\so\0208>_

Пример 2: использование широких потоков.

Код:

#include <assert.h>
#include <iostream>

#include <fcntl.h>      // _O_WTEXT
#include <io.h>         // _setmode, _isatty

namespace console {
    struct Usage
    {
        Usage()
        {
            const int out_fileno = _fileno( stdout );

            assert( _isatty( out_fileno ) );
            _setmode( out_fileno, _O_WTEXT );
        }
    };
}  // console

const console::Usage console_usage;

auto main() -> int
{
    using namespace std;
    wcout << L"Oh look, a \u2659!" << endl;
}

Я помню, что в свое время, вероятно, с оригинальной MinGW g++, нужно было определить какой-то специальный символ препроцессора, чтобы определить расширения библиотек Microsoft. Тем не менее, это скомбинировано с использованием MinGW g++ 4.9.1 из распределения Nuwen. И, конечно же, он также хорошо компилируется с помощью Visual C++.

  • 0
    Это точка, где мы снова встречаемся позитивно. Хотя предоставление рабочего образца значительно улучшит ответ!
  • 0
    если вы не против привести пример, мне трудно понять, как это сделать
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню