2014-12-27 59 views
0

我試圖在使用visual studio時打印「pawn」,但它不能識別unicode。試圖在Visual Studio 2013中打印棋子

誰能告訴我如何解決它?

這是一個基本的例子:

#include <iostream> 

using namespace std; 

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

和輸出我得到的是:

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

+0

請不要在例子中使用'void main',因爲這是無效代碼,學習者閱讀SO可能會毫不留情地複製它。 – 2014-12-27 21:57:57

回答

3

普通的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++編譯。

+0

這就是我們再次見面的地方。雖然提供一個有效的樣本可以改善答案! – 2014-12-27 20:09:24

+0

如果你不介意給出一個例子,我很難理解如何去做 – Mumfordwiz 2014-12-27 20:18:39

+0

@Mumfordwiz:好的,例子來了,但是需要一些時間,對不起。 ;-) – 2014-12-27 21:56:46