我試圖在使用visual studio時打印「pawn」,但它不能識別unicode。試圖在Visual Studio 2013中打印棋子
誰能告訴我如何解決它?
這是一個基本的例子:
#include <iostream>
using namespace std;
int main()
{
cout << "\33[37;42m\u2659\33[0m";
}
和輸出我得到的是:
"<-[37;42m?<-[0m".
我試圖在使用visual studio時打印「pawn」,但它不能識別unicode。試圖在Visual Studio 2013中打印棋子
誰能告訴我如何解決它?
這是一個基本的例子:
#include <iostream>
using namespace std;
int main()
{
cout << "\33[37;42m\u2659\33[0m";
}
和輸出我得到的是:
"<-[37;42m?<-[0m".
普通的Windows控制檯窗口不支持ANSI轉義序列。
顯示常規的Unicode字符,你可以
使用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控制檯字體。那’是因爲控制檯窗口的實現根本不支持這些字符的顯示。該字符被正確存儲,並且可以將其複製出來並且例如將其呈現在Windows Write(標準附件程序)中,但是對於普通最終用戶來說,這是不切實際的,我們可以說這是不切實際的。
一個簡單的解決方案是要求使用例如更換控制檯窗口Console。
然後你也可以得到漂亮的標籤。 ;-)
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 ++,一個不得不定義一些特殊的預處理符號來獲得所定義的微軟庫擴展。但是,這很好地與Nuwen發行版中的MinGW g ++ 4.9.1一起編譯。當然,它也可以很好地與Visual C++編譯。
這就是我們再次見面的地方。雖然提供一個有效的樣本可以改善答案! – 2014-12-27 20:09:24
如果你不介意給出一個例子,我很難理解如何去做 – Mumfordwiz 2014-12-27 20:18:39
@Mumfordwiz:好的,例子來了,但是需要一些時間,對不起。 ;-) – 2014-12-27 21:56:46
請不要在例子中使用'void main',因爲這是無效代碼,學習者閱讀SO可能會毫不留情地複製它。 – 2014-12-27 21:57:57