Я пытаюсь напечатать "пешку" при использовании визуальной студии, и она не распознает юникод.
может ли кто-нибудь сказать мне, как это исправить?
это основной пример:
#include <iostream>
using namespace std;
int main()
{
cout << "\33[37;42m\u2659\33[0m";
}
и выход я получаю:
"<-[37;42m?<-[0m".
Обычные оконные окна 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++.
void main
в примерах, поскольку это неверный код, и учащиеся, читающие SO, могут скопировать его некритически.